为什么如果我在没有块的情况下调用条件方法,我可以if foo? bar.baz
,但是我需要做一个块:
if foo?; bar.each { |n| n.baz } end
如何使用多行块进行相同操作?
bar.each do |n|
n.quack
end
答案 0 :(得分: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
答案 1 :(得分: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