【问题标题】:Operator precedence for And/&& in Ruby [duplicate]Ruby中And/&&的运算符优先级[重复]
【发布时间】:2010-12-22 20:48:17
【问题描述】:

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

ruby 文档说上述关键字的优先级是:(1)&&、(2)=、(3)and。

我有这个我写的sn-p代码:

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?

【问题讨论】:

    标签: ruby and-operator


    【解决方案1】:

    我不太明白你问的问题。我的意思是,您已经自己给出了答案,甚至问这个问题之前:&&= 更紧密,而and 比@987654324 更紧密@。

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

    ( 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
    

    【讨论】:

      【解决方案2】:

      原因很简单:优先。正如你所说,顺序是:

      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 
      

      【讨论】:

      • 我在你的例子中不明白为什么它不会被评估为:if a = ( f(2) && b ) = f(4) then
      【解决方案3】:

      来自Programming Ruby 1.9

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

      【讨论】:

        【解决方案4】:

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

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

        显然,在第 2 步中我们得到了一个不正确的情况 - = 的左侧是右值 - 临时对象,它不能被任何值分配。我假设句法分析器在遇到这种情况时会破坏表达式的优先级评估规则。 更多关于表达式计算的细节可以查看here

        【讨论】:

          【解决方案5】:

          如果你像这样修改你的代码,你会得到你所期望的

          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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-10-07
            • 2016-06-17
            • 1970-01-01
            • 1970-01-01
            • 2019-01-17
            相关资源
            最近更新 更多