Ruby 运算符优先级如何适用于条件块?
为什么如果我调用一个没有块的条件方法,我可以执行Ruby 运算符优先级如何适用于条件块?,ruby,Ruby,为什么如果我调用一个没有块的条件方法,我可以执行if-foo?bar.baz,但对于块,我必须执行以下操作: if foo?; bar.each { |n| n.baz } end 对于多行块,我该怎么做呢 bar.each do |n| n.quack end 您提供的第一个版本将从bar.each执行结果传递给foo?那么它期待着福?进行辩论 第二个版本将执行bar。每个仅当foo?为真时 我建议您使用以下样式: if foo? bar.each do |n| n.q
if-foo?bar.baz
,但对于块,我必须执行以下操作:
if foo?; bar.each { |n| n.baz } end
对于多行块,我该怎么做呢
bar.each do |n|
n.quack
end
您提供的第一个版本将从bar.each执行结果传递给foo?那么它期待着福?进行辩论 第二个版本将执行
bar。每个仅当foo?
为真时
我建议您使用以下样式:
if foo?
bar.each do |n|
n.quack
end
end
这也回答了你的最后一个问题
注意:如果您实际希望将一个参数传递给foo?
,这是执行块的结果,那么最好使用一个helper变量:
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
所有这些“如果”都很难读懂。将条的结果提取到一个变量中,然后-bam!-问题消除了。而且,#每个
都不符合您可能认为的功能。每个
的结果都是返回条
,因此不需要cond
,如果是foo?条形码是等效的-只要块对条形码没有副作用(无论如何这是个坏主意)@lain我说你最好
不要
你应该当然,你可以决定不使用变量,但这无助于你的设计,也无助于所有的可读性添加实际上没有任何作用的变量是不好的做法,因为这意味着每个
在实践中等同于map
这样的函数。