上京エンジニアの葛藤

都会に染まる日々

「初めてのRuby」を読んだ(4章)

前回より少し間が空きましたが、今回は 4章「文字列」についてまとめていきます
読み終えてはいるのですが、まとめるのに時間がかかる・・・

前回の3章「数値」はこちら

文字列

文字列リテラルについて

"", '' で作成したい文字列を括ることで文字列リテラルとして解釈される

puts "Hello Ruby" # => "Hello Ruby"

バックスラッシュ記法について

"" で区切られた文字列はバックスラッシュを解釈することができる

"\n" # => 改行コード(LF)  
"\s" # => スペース

'\n' # => "\n"
'\s' # => "\s"

式展開について

ダブルクォーテーションで括られた文字列内部では文字列展開が行われるが、シングルクォーテーションの場合は展開されない

str = "Ruby"
puts "Hello #{str}" # => "Hello Ruby"
puts 'Hello #{str}' # => "Hello \#{str}"

内部的な処理としては、 to_s を呼び出しオブジェクトの文字列表現を取得しようとしている

文字列化メソッドについて

  • to_s メソッド オブジェクトを人間が読みやすい形で文字列化する
    puts メソッドでは引数を to_sメソッドで文字列化した結果を出力している

  • inspect メソッド プログラムの内部状態を把握するために適した形で文字列化する
    p メソッドは、引数を inspect した結果を出力している

バッククォート文字列

バッククォートで括ることで特殊な文字列となり、中身をシェルコマンドとして実行しコマンドが出力した結果を元に文字列を構築する

`which bash` # => "/bin/bash\n"

パーセント記法

"", '' 以外で文字列リテラルを表現する方法としてパーセント記法がある

str = "Ruby"
%Q[Hello #{str}] # => "Hello Ruby"
%q[Hello #{str}] # => "Hello \#{str}"

ヒアドキュメント

行を区切りとする文字列リテラルである
式展開、バックスラッシュ記法は区切り語を括っている引用符によって決まり、デフォルト(何もつけない場合)では "" と同じである
また、区切り語の前に <<-"" のように - をつけることで、ヒアドキュメント終了の区切り語の行で空白スペースを許容することができる
インデントを揃えたいような時に便利

sample = <<"EOS"
hoge
bar
foo
EOS

puts sample
# => hoge
# => bar
# => foo

文字列操作

  • 結合
puts "Hello " + "Ruby" # => "Hello Ruby"
  • 反復
puts "Hello" * 3 # => "HelloHelloHello"
  • 分解
"Perl Ruby PHP".split(/s, ,/) # => "Perl Ruby PHP"
  • 比較
"Ruby" == "Ruby" # => true
"Ruby" == "Perl" # => false

シンボルについて

文字列は内容が同じ場合でも同一のオブジェクトは限らないがシンボルでは同じオブジェクトとして扱う
オブジェクトとして同一か調べれば良いので文字列と比べて高速に処理することができる
また、内容に対して唯一性を維持しなければいけないので immutable である

str = :ruby
puts str # => ruby

hash = {:hoge => "hoge"}
puts hash[:hoge] # => "hoge"

感想

  • 正規表現Perl を継承されているぞ
  • マルチバイトも扱いやすい
  • ヒアドキュメント周りの仕様知らなかったので知ることができた
  • 文字列の処理に関して、他の言語と比較して Ruby だけが特別な部分があまり感じなかった