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

Alo*_*lon 14 ruby and-operator

我对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
Run Code Online (Sandbox Code Playgroud)

输出是:

1)2 4 [预期]

2)4 4 [ 为什么?]

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

Jör*_*tag 23

我不太明白你问的问题.我的意思是,你已经自己给出了答案,之前甚至提出质疑:&&结合更紧比=同时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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)


Pes*_*sto 21

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

  1. &&
  2. =

由于&&具有优先权=,因此语句的评估方式如下:

if a = (f(2) && (b = f(4))) then 
Run Code Online (Sandbox Code Playgroud)

结果如下:

if a = (2 && 4) then
Run Code Online (Sandbox Code Playgroud)

xy是整数时,x && y返回y.从而2 && 4导致a = 4.

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

if (a = f(2)) and  (b = f(4)) then 
Run Code Online (Sandbox Code Playgroud)