clmemo@aka: Ruby で文字列置換 〜 正規表現を使わずに の続き。Just another Ruby porter, さんの記事を参考に。
ここでは
&&=を使うのがぴったり。str["perl"] &&= "ruby"
おお、とても良いことを教えてもらった。ありがとう!!
試してみる
元のコードは次の通り。
str = "This is perl test"
pl = "perl"
if str.include?(pl)
str[pl] = "ruby"
end
これを、&&= を使って書き直すと、こうなる。
str = "This is perl test"
pl = "perl"
str[pl] &&= "ruby"
わっ。コードの量が減って可読性も上がった。バグも減らせそう。
すると、前のエントリーの最終コードは次の様にシンプルになる。
IMAGE = [
"http://www.foo.org/bar.png",
"http://www.hogehoge.net/o/NNN_NNNN.jpg",
"http://sample.net/more.png"
]
IMAGE.each { |img|
line[img] &&= "external/" + File.basename(img)
}
とてもスッキリ、これは良いね。
Syntax Sugar
Just another Ruby porte, さんによると、&&= は次のコードのシンタックス・シュガーとのこと。
str["perl"] &&= "ruby"(シンタックス・シュガー)str["perl"] && str["perl"] = "ruby"(本来のコード)
フムフム、勉強になる。str["perl"] 自身が bool 値を返すのか?
ワンライナーで確認。
$ ruby -e 'p "This is perl"' "This is perl" $ ruby -e 'p "This is perl".include?("perl")' true $ ruby -e 'p "This is perl"["perl"]' "perl" $ ruby -e 'p "This is perl"["ruby"]' nil
上から見ていく。一つ目は文字列の確認。OK。
二つ目は include? のテスト。true が返ってる。
三つ目は str["words"] のテスト。なるほど、マッチした文字列が返るのか。Ruby は nil もしくは false 以外は true と等価なので、"perl" が返っているからこのテストは true と。
四つ目は、わざと間違えてみるテスト。見事に nil が返ってる。フムフム、すると str["perl"] = ruby で文字列 str に perl が含まれていないと、nil = ruby という風になっちゃうからエラーになるのね。
Ruby 面白いなぁ。
0 件のコメント:
コメントを投稿