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 面白いなぁ。
No comments:
Post a Comment