ブレースとdo/endの結合度
ここ1,2週間くらいちょっとRubyを触りだしているのですが、一昨日勉強会で知った事があります。
p [1,2,3].map { |v| v + 1 } p [1,2,3].map do |v| v + 1 end
これまでブレースとdo/endは常に置き換え可能なものなのかと思っていたのですが、上記を実行すると
[2, 3, 4]
[1, 2, 3]
となるんですね。はっし〜〜さんによると結合順序から来る現象らしいのですが、まだ理解できていません。更によく分からない事に、
w = [1,2,3].map do |v| v + 1 end p w
という風に代入すると
[2, 3, 4]
になるんですよね。うむむ。
…とブログ書きながら調べてみたら、この説明でなんとなく分かりました。最初の例だと「mapメソッドの戻り値」がpに渡されて、次の例だと「何もしないmap」と「doのブロック」の2つが渡されているんですね。
という事でブロック内で文字列を出してみました。
p [1,2,3].map { |v| p "hello1" v + 1 } p [1,2,3].map do |v| p "hello2" v + 1 end
結果
"hello1"
"hello1"
"hello1"
[2, 3, 4]
[1, 2, 3]
おー、やはり2番目の例はブロックが実行されていなかったんですね。
しかしまだ分かっていないのが3番目の例です。代入する時左辺が1つだから、右辺も1つになるようにまとめて評価される、みたいなイメージなんでしょうか???
うーむ、先は長そう。id:zuisenerさん曰く「日本=Rubyの国」らしいので、何とか使えるようになりたいものですが。ちなみに今はアセンブラとJavaしか使えません(と言ってもアセンブラは中学高校浪人までなのでかなーり忘れてしまい、実質Javaのみでした)。