2013-03-04

Ruby で文字列置換 〜 正規表現を使わずに その 2

clmemo@aka: Ruby で文字列置換 〜 正規表現を使わずに の続き。Just another Ruby porter, さんの記事を参考に。

ここでは&&=を使うのがぴったり。

str["perl"] &&= "ruby"

Re: Ruby で文字列置換 〜 正規表現を使わずに - jarp, より引用

おお、とても良いことを教えてもらった。ありがとう!!

試してみる

元のコードは次の通り。

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