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

4.1.2 バックスラッシュ記法
ダブルクォートで囲んだ場合はタブ文字が有効で、シングルクォートの場合は無効、と一般的な仕様。
pだと変数展開が無効化されてしまったのでprintで出力。<<はビットシフトと同じ記述だけどここでは文字列の連結を意味している。

print "abc\tdef" << "\n" #=>abcdef<改行>
print 'abc\tdef' << "\n" #=>abc\tdef<改行>

p     "abc\tdef"         #=>"abc\tdef"

4.1.3 式展開
ダブルクォート文字列中の#{...}で囲んだ部分は式として解釈され、式の最終的な値が文字列として出力される。

kazu = 5
print "kazu = #{kazu}"                      #=>kazu = 5(変数を展開)

print "kazu = #{5}"                         #=>kazu = 5(数値オブジェクトをそのまま置いてみた)
print "atai = #{atai = 3; atai += 2; atai}" #=>atai = 5("式"とあったのでずらずら書いたらちゃんと最後の結果が出た)

文字列化メソッド
ダブルクォート文字列中の式展開では、対象オブジェクトのto_sメソッドにより文字列オブジェクトに変換した結果が出力される。

print "#{123}"      #=>123(数字オブジェクト 123 を文字列オブジェクト "123" に変換に変換した上で出力)
print "#{"123"}"    #=>123(文字列オブジェクト "123" を出力)
print "#{123.to_s}" #=>123(↑と同じ)

他にもオブジェクトの内部状態を把握しやすい形式で出力するinspectメソッドというのもある。
ちょいちょい不思議な挙動を見せていたpの出力もこれによるもの。

print nil.to_s    #=><空>(nilオブジェクトを文字列に変換した上で出力)
print nil.inspect #=>nil(nilオブジェクトの内部状態を出力)
p     nil         #=>nil(↑と同じ)

4.1.4 バッククォート文字列
Perlと同様にバッククォートで囲んだ内容はシェルにより処理される。

p `date`         #=>"Tue Feb 28 01:39:32 JST 2012\n"(dateコマンドを実行)
p `date | wc -m` #=>"29\n"(dateコマンドの出力をwcコマンドにパイプ)
p `echo $SHELL`  #=>"/bin/bash\n"(環境変数 $SHELL を表示)

4.1.5 パーセント記法
Perlでいう q/hoge/ みたいなやつ。
なんとなく/(スラッシュ)で囲んで見たが他の文字も使える点も同じ。

print %q/single\tquote\tdesu!!/ #=>single\tquote\tdesu!!

同じ qq/hoge/ みたいなやつ。

print %/double\tquote\tdesu!!/  #=>doublequotedesu!!
print %Q/double\tquote\tdesu!!/ #=>doublequotedesu!!

さらに qw/one two three/ みたいなやつ。

print %w/one two three/         #=>["one", "two", "three"](配列)

さらにさらに qx/date/ みたいなのも。

print %x/date/                  #=>Tue Feb 28 02:02:19 JST 2012

4.1.6 ヒアドキュメント
ヒアドキュメントを使ってダブルクォート文字列やシングルクォート文字列を書ける。

egg = "tamago"
print <<"ABC"        #=>egg = tamago(ダブルクォート文字列)
    egg = #{egg}
ABC

print <<'XYZ'        #=>egg = #{egg}(シングルクォート文字列)
    egg = #{egg}

通常、ヒアドキュメントの終端を示す文字列は左に空文字を挟めないが、<<-と指定することで終端の文字列をインデントして揃えることができる。

if true
    print <<-"TKG"
        Tamago Kake Gohan !!
    TKG
end

Perlでも終端の文字列にインデントを含めれば・・・

if (1){
    print <<"    TKG";
        Tamago Kake Gohan !!
    TKG
}

4.2 文字と文字リテラル
文字リテラルは?(クエスチョン)に続けて文字を書くことで表現できる。
ただし、Ruby 1.8では文字は「バイト列」、Ruby 1.9では「文字」として扱うため挙動が異なる。

なお、Ruby 1.9で文字を示すクラスが増えたわけではなく、属するクラスはStringとなる。

p ?a       #=>97(Ruby 1.8で実行)
p ?a.calss #=>Fixnum

p ?a       #=>"a"(Ruby 1.9で実行)
p ?a.calss #=>String

p ?abc #=>syntax error, unexpected $end, expecting ':'(怒られた)



とりあえず今日はここまで。この章、地味に長いな・・・