为什么 do/end 和 {} 不总是等效的?

6
我始终认为以下两种方式只是表达同一件事情的两种方式:

可能是重复问题:
Ruby块和未加括号的参数
这些块编码风格在Ruby中有什么区别或价值?

但实际上它们之间有什么不同吗?

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

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

但是在我的一个 ERB 模板中,我遇到了一些奇怪的问题,其中两种语法似乎做了两件不同的事情。这段代码运行良好:

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

但是当我将其改写为:
<%=raw @menu.collect do |m| 
    content_tag("li") do
        link_to(m.capitalize, url_for(:controller => m))
    end 
end %>

我只是得到了一个连接在一起的字符串,它包含了我的@menu项。我是否错过了什么?这里是否有一些微小的语法糖阻碍了我?


2
...以及Ruby块和未加括号的参数 - Jörg W Mittag
啊!现在我很纠结。要删除还是不删除?有4个赞,也许我的措辞对某人有用? - Matt Zukowski
@Matt,这是一个重复的问题,但没有必要删除。 - Matthew Flaschen
1个回答

0

我会使用你的第一种方法,或者将这段代码放在视图助手中。但是如果我想使用块,我可能会这样做。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接