0

为什么如果我在没有块的情况下调用条件方法,我可以做if foo? bar.baz,但我必须做一个块:

if foo?; bar.each { |n| n.baz } end

我将如何对多行块做同样的事情?

bar.each do |n|
  n.quack
end
4

2 回答 2

1

您提供的第一个版本会将 bar.each 执行的结果传递给 foo?所以它期望 foo?进行辩论。

bar.each只有当foo?它是真的时,第二个版本才会这样做。

我建议您使用以下样式:

if foo?
   bar.each do |n|
     n.quack
   end 
end

这也回答了你的最后一个问题。

注意:如果您实际上希望将单个参数传递给foo?该块的执行结果,则最好使用辅助变量:

cond = bar.each do |n|
  n.quack
end 

if foo? cond
   .. do stuff
end
于 2012-12-21T09:05:34.897 回答
1

你可以使用这些结构,但是上面提到的它是不可读的。您必须避免编写不可读的代码。

if true then [1, 2].map { |n| n * 2 } end
=> [2, 4] 

[1, 2].map do |n|
  n * 2
end if true
=> [2, 4] 

[1, 2].map do |n|
  n * 2
end if false
=> nil 
于 2012-12-21T09:13:39.447 回答