这个问题在这里已经有答案了:

我有一个关于 Ruby 中的 and/&&/= 关键字的问题。

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:

两种形式的唯一区别是优先级(and 结合低于 &&).

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

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

显然,在步骤 2 中我们得到了一个不正确的情况 - = 的左侧是右值 - 临时对象,不能分配任何值。我假设语法分析器在遇到这种情况时违反了表达式优先级评估的规则。有关表达式计算的更多详细信息,请参阅 这里

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top