为什么如果我在没有块的情况下调用条件方法,我可以做if foo? bar.baz
,但我必须做一个块:
if foo?; bar.each { |n| n.baz } end
我将如何对多行块做同样的事情?
bar.each do |n|
n.quack
end
为什么如果我在没有块的情况下调用条件方法,我可以做if foo? bar.baz
,但我必须做一个块:
if foo?; bar.each { |n| n.baz } end
我将如何对多行块做同样的事情?
bar.each do |n|
n.quack
end
您提供的第一个版本会将 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
你可以使用这些结构,但是上面提到的它是不可读的。您必须避免编写不可读的代码。
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