Ruby 红宝石`&&;`在一个街区里
在下面的代码中,如果我将Ruby 红宝石`&&;`在一个街区里,ruby,operator-precedence,Ruby,Operator Precedence,在下面的代码中,如果我将any?语句中的和替换为&,它将抛出一个错误意外的消息标识符,应为“}” def ArrayAddition(arr) i = 2 until i == arr.length combinations = arr.permutation(i).to_a return true if combinations.any?{|array| array.inject(&:+) == arr.max and !array.include? arr.m
any?
语句中的和替换为&
,它将抛出一个错误意外的消息标识符,应为“}”
def ArrayAddition(arr)
i = 2
until i == arr.length
combinations = arr.permutation(i).to_a
return true if combinations.any?{|array| array.inject(&:+) == arr.max and !array.include? arr.max}
i+=1
end
false
end
这是怎么回事?Ruby是否以不同的方式处理这些运算符?是<代码>和
的优先级低于和&
(和)。这句话:
foo and bar baz
foo && bar baz
…的解析如下所示:
foo and (bar baz)
(foo && bar) baz
…所以Ruby知道foo
是一个方法名(因为它不能是任何其他名称)。另一方面,此表达式:
foo and bar baz
foo && bar baz
…的解析如下所示:
foo and (bar baz)
(foo && bar) baz
…这毫无意义,你会得到一个语法错误
一般来说,您应该使用&&
,除非您特别想要和的较低优先级,因此在这种情况下,最容易解决语法错误的方法是在方法参数周围使用括号:
foo && bar(baz)
…因此:
array.inject(&:+) == arr.max && !array.include?(arr.max)
另外,这也更具可读性。运算符和以及和&
具有不同的优先级,并且不是等价的。因此,建议不要使用和
和或
运算符:
由于优先级不同,表达式中的其他运算符具有较高或较低的比较优先级。在这种情况下,数组#include?
调用的参数最终绑定到错误的表达式
您可以通过在数组#include?
调用的参数周围添加括号来解决此问题。亲爱的下一次投票人:请花点时间解释下一次投票的原因。如果我的回答有问题,我将非常感谢有机会改进它。@MichaelGaskill非常感谢@乔丹,今天有人心情不好)如果你对答案有建设性的补充,请评论。任意匿名的否决票对提高答案的质量没有任何作用。否决票是为了抵制巨魔今晚决定对我们施加的任何影响(我猜…),以及样式指南链接。谢谢,@Jordan-我不知道是谁。我当然更喜欢建设性的反馈来改进答案。但我想,否决一个答案并继续前进更容易(也许更令人满意),“总是用&&和| |代替”是相当苛刻的和
和或
对于控制流非常有效。