为什么不/ do和{}总是等价?

可能重复:
Ruby块和不带括号的参数
Ruby中这些块编码样式的区别或价值是什么?

我一直认为以下只是两种说法相同的方式:

[1,2,3].collect{|i| i * 2} [1,2,3].collect do |i| i * 2 end 

但是我在我的一个ERB模板中得到了一些奇怪的行为,其中两个语法似乎做了两件不同的事情。 这段代码效果很好:

  m)) } } %> 

但是当我重写它时:

  m)) end end %> 

…我最终得到了一串连结的@menu项目。 我错过了什么吗? 这里有一些细小的语法糖吗?

我会使用您的第一种方法或将此代码放在视图助手中。 但如果我确实想要使用块,我可能会做这样的事情。

 <% @menu.collect do |m| %> <%= content_tag("li") do %> <% link_to(m.capitalize, url_for(:controller => m)) %> <% end %> <% end %>