Ruby基礎復習(2) Stringクラス

パーフェクトRuby p.148から学習。文字列ことStringクラス。

まずは基本操作系。

1s = "hoge"
2s.empty? # => false
3s.length # => 4
4s.size # => 4
5s.bitesize # => 8
6s.include?("og") => true

演算子での操作。

1'hoge' + 'fuga' # => 'hogefuga'
2'hoge' * 3 => 'hogehogehoge'

破壊的な文字列の追加。

1s = "hoge"
2s << "fuga" # => "hogefuga"
3s.concat("piyo") # => "hogefugapiyo"

切り出し。

1s = "hogefuga"
2s.slice(3) # => "e"
3s.slice(2,5) # => "gefu"
4s.slice(-4,2) # => "fu"
5s.slice(2..5) # => "gefu"

#sliceを使わず、以下記法でも同等。

1s = "hogefuga"
2s[3] # => "e"
3s[2,5] # => "gefu"
4s[-4,2] # => "fu"
5s[2..5] # => "gefu"
6s[//]

文字列の整形に関するメソッドいろいろ。特に#chop#chompとか紛らわしいとよく言われる。英単語の意味するところとしてchop=刻むってことで1文字削除されるのはわかるが、そこにmが足されると改行コードの削除になるのはなぜなんだろう。。。あと#squeezeなんかは使う場面がいまいち想像できない。

なお、ここにあるメソッドはすべて非破壊的。末尾に!を付けることで破壊的操作になる。

 1s = " aaa "
 2s.strip # => "aaa"
 3s.rstrip # => " aaa"
 4s.lstrip # => "aaa "
 5
 6s = "aaa\n\n"
 7s.chomp # => "aaa\n"
 8s = "abcd"
 9s.chop # => "abc"
10
11s = "aaaabbbbcccc"
12s.squeeze # => "abc"
13s.squeeze('ab') # => "abccc"
14
15"ABC".downcase # => "abc"
16"def".upcase # => "DEF"
17"Abc".swapcase # => "aBC"
18"tITle".capitalize # => "Title"
19
20"abc".reverse # => "cba"

置換。第一引数で検索を行い、ヒットした箇所を第二引数で置換するか、あるいはブロックに引き渡して操作、という建て付けのよう。#subだと最初に一致したもののみ、#gsubだとヒットしたすべての箇所が置換される。これも破壊的、非破壊的の2種類あり。

1"aaaa".sub("a","b") # => "baaa"
2"24-1-365".gsub(/[0-9]+/) {|str| str.to_i.succ} # => 25-2-366

配列への変換。#splitで第一引数に指定した文字をセパレータとした分割が可能。第二引数には分割最大数が指定できる。また1文字ずつ操作したい場合は#each_charが使える。ブロックへの引き渡しも可能。似たところで#each_byteもある。

1str = "Alice, Bob, Charlie"
2
3str.split(",") # => ["Alice", "Bob", "Charlie"]
4"Alice".each_char.to_a # => ["A","l","i","c","e"]