ブレースと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のみでした)。