我对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?
答案 0 :(得分:22)
我不太明白你问的问题。我的意思是,你已经已经给出了答案,之前甚至提出了问题:&&
比=
更紧密而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}}
答案 1 :(得分:21)
原因很简单:优先权。如你所说,订单是:
由于&&
优先于=
,因此语句的评估方式如下:
if a = (f(2) && (b = f(4))) then
结果是:
if a = (2 && 4) then
当x
和y
为整数时,x && y
会返回y
。因此2 && 4
会产生a = 4
。
为了比较,第一个评估如下:
if (a = f(2)) and (b = f(4)) then
答案 2 :(得分:2)
两种形式的唯一区别是优先级(
and
低于&&
)。
答案 3 :(得分:0)
我不知道在这种情况下可以提供帮助的具体规则,但让我们使用操作的优先级。 使用优先级规则,我们可以将第二个表达式的计算分为几个步骤
1 f(2) && b => expr1
2 expr1 = f(4) => expr2
3 a = expr2
很明显,在第2步中我们得到了一个不正确的情况 - 在=左边是rvalue - 临时对象,它不能被任何值赋值。我假设语法分析器在遇到这种情况时会破坏表达式的优先级评估规则。 有关表达式计算的更多详细信息,请参见here
答案 4 :(得分:-6)
如果您修改这样的代码,您将得到您期望的
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