Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 红宝石`&&;`在一个街区里_Ruby_Operator Precedence - Fatal编程技术网

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-我不知道是谁。我当然更喜欢建设性的反馈来改进答案。但我想,否决一个答案并继续前进更容易(也许更令人满意),“总是用&&和| |代替”是相当苛刻的
对于控制流非常有效。