「初めてのRuby」 4章 文字列(その3)

4.5 文字列操作
文字列の結合、反復、分解、比較、反転、空白削除、長さ取得。

# -*- coding: utf-8 -*-
print "abc" + "def" #=>abcdef(結合)

oyatsu = "いちご"
oyatsu << "大福\n"
print oyatsu        #=>いちご大福(破壊的結合)

oyatsu2 = "ねる" * 2 + "ねるね\n"
print oyatsu2       #=>ねるねるねるね(反復)

p "a,b, cc, ddd,  eeeee".split(/,\s*/)
#=>["a", "b", "cc", "ddd", "eeeee"](分解)

p "aaa" == "aaa"  #=>true
p "aaa" != "aab"  #=>true
p "aaa" <  "aab"  #=>true
p "aaa" <  "aaa"  #=>false
p "aaa" <= "aaa"  #=>true
p "aaa" <=> "aab" #=>-1
p "aab" <=> "aab" #=>0
p "aab" <=> "aaa" #=>1

p "today=3/8".reverse          #=>"8/3=yadot"(反転)
p "  <-Space,Return->\n".strip #=>"<-Space,Return->"(先頭,末尾の空白削除)
p "moji".length                #=>4(文字の長さ)
p "文字".length                #=>2(マルチバイトもいける)

4.6 イテレータ
文字列をbyte単位、行単位で扱うイテレータ
Ruby 1.9ではマルチバイト対応のeach_charも使える。
Perlだと切り出す処理を書くからここまでさらっとは書けないか・・・

"moji".each_byte do |byte|
        p byte
end
#=>109
   111
   106
   105

"文字列".each_char do |moji|
    print moji + "\n"
end
#=>文
   字
   列

lunch = <<"EOS"
3/5 ラーメン
3/6 スープカレー
3/7 タンタン麺
EOS

lunch.each_line do |line|
        print line
end
#=>3/5 ラーメン
   3/6 スープカレー
   3/7 タンタン麺

4.7 フォーマット
C言語でもPerlでもお馴染みのアレ。
String#%メソッドを使った方が書くのは楽そうだけどまだパッと読めない。。

p sprintf("%04d", 123)      #=>"0123"
p sprintf("%03.2f", 42.195) #=>"42.20"
p sprintf("hex=%x HEX=%X oct=%o bin=%b", 10, 10, 10, 10)
#=> "hex=a HEX=A oct=12 bin=1010"

# 同じ処理を String#% メソッドで書いた
p "%04d" % 123
p "%03.2f" % 42.195
p "hex=%x HEX=%X oct=%o bin=%b" % [10, 10, 10, 10]

4.8 シンボル
比較を高速に行うために作られたもので「内容が同じなら同一オブジェクト」という性質をもつ。
なるほど、ハッシュのキーとして文字列オブジェクトの代わりに使うことが推奨されてたのはそのためか。

p :"hoge" #=>:hoge(:に続けて文字列を指定するとシンボルになる)
p :hoge   #=>:hoge(識別子として妥当なら""を付けなくてもOK)
p :123    #=>syntax error(数字始まりは妥当な識別子ではない)
p :"ほげ" #=>:"\u307B\u3052"(マルチバイトもいけた)

str1 = "nemui"
str2 = "nemui"
p str1 == str2     #=>true
p str1.equal? str2 #=>false(内容が同じでも別のオブジェクト)

symbol1 = :nemui
symbol2 = :nemui
p symbol1 == symbol2     #=>true
p symbol1.equal? symbol2 #=>true(内容が同じなら同じオブジェクト)



以降はマルチバイト文字列の話になるのでここで一区切り。

フレームワークやモジュールのRuby 1.9対応状況ってどうなんだろうなー。
近いうちにRuby 1.9が主流になる状況ならRuby 1.8の仕様はさらっと流す程度にしたいw