Ruby中And / &&的运算符优先级

我对Ruby中的和/ && / =关键字有疑问。

ruby文档说,所提到的关键字的优先级是:(1)&&,(2)=,(3)和。

我有这段代码我写道:

def f(n) n end if a = f(2) and b = f(4) then puts "1) #{a} #{b}" end if a = f(2) && b = f(4) then puts "2) #{a} #{b}" end 

输出是:

1)2 4 [预期]

2)4 4 [ 为什么 ?]

出于某种原因,使用&&会导致a和b评估为4?

我不太明白你问的问题。 我的意思是,在你提出这个问题之前 ,你已经给出了答案: &&绑定比=更紧密, and绑定比=更紧。

因此,在第一种情况下,表达式的计算方法如下:

 ( a=f(2) ) and ( b=f(4) ) ( a= 2 ) and ( b=f(4) ) 2 and ( b=f(4) ) # a=2 2 and ( b= 4 ) # a=2 2 and 4 # a=2; b=4 4 # a=2; b=4 

在第二种情况下,评估如下:

 a = ( f(2) && ( b=f(4) ) ) a = ( 2 && ( b=f(4) ) ) a = ( 2 && ( b= 4 ) ) a = ( 2 && 4 ) # b=4 a = 4 # b=4 4 # b=4; a=4 

原因很简单:优先权。 如你所说,订单是:

  1. &&
  2. =

由于&&优先于= ,因此语句的计算方式如下:

 if a = (f(2) && (b = f(4))) then 

结果如下:

 if a = (2 && 4) then 

xy是整数时, x && y返回y 。 因此2 && 4导致a = 4

为了比较,第一个评估如下:

 if (a = f(2)) and (b = f(4)) then 

从编程Ruby 1.9 :

两种forms的唯一区别是优先级( and绑定低于&& )。

我不知道在这种情况下可以提供帮助的具体规则,但让我们使用操作的优先级。 使用优先级规则,我们可以将第二个表达式的计算分为几个步骤

 1 f(2) && b => expr1 2 expr1 = f(4) => expr2 3 a = expr2 

很明显,在第2步中我们得到了一个不正确的情况 – 在=左边是rvalue – 临时对象,它不能被任何值赋值。 我假设语法分析器在遇到这种情况时会破坏表达式的优先级评估规则。 关于表达式计算的更多细节可以在这里找到

如果您修改这样的代码,您将得到您期望的

 def f(n) n end if (a = f(2) and b = f(4)) then puts "1) #{a} #{b}" end if (a = f(2) and b = f(4)) then puts "2) #{a} #{b}" end 

1)2 4

2)2 4