运算符优先级如何适用于条件块?

时间:2012-12-21 09:00:21

标签: ruby

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

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

如何使用多行块进行相同操作?

bar.each do |n|
  n.quack
end

2 个答案:

答案 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