以下代码似乎随机返回d
或nil
的预期数组。
def f arg
arg
end
def g *args
args
end
x,y,z = [true, 'two', false]
if a = f(x) and b = f(y) and c = f(z) then
d = g(a,b,c)
end
p d
答案 0 :(得分:0)
=
运算符执行赋值。它与等于运算符(==
)不同,您可以使用它来比较两个值。
以下是如何使用这些内容的典型示例:
def speak(name)
if name == 'Hal'
puts "I can't do that, Dave."
end
end
myName = 'Hal'
speak(myName)
然后输出是:
I can't do that, Dave.
您在=
语句的条件下使用if
,您可能希望使用==
。在irb
中,会生成如下警告:
(irb):9: warning: found = in conditional, should be ==
所以你可能想知道,如果我使用了错误的操作符,为什么我的代码完全可以工作?
您的代码仍然可以执行,因为
这意味着,在您的代码中,除了分配变量之外,a = f(x)
,b = f(y)
和c = f(z)
每个都会返回一个值。
在每种情况下,返回的值分别与分配的值相同:true
,"two"
和false
。因此,您的if
语句正在评估此条件:
true and "two" and false
在Ruby中,除了false
和nil
之外,所有值都是“真实的”。
字符串“two”是真实的,因为它既不是false
也不是nil
。但是,false
当然是“假的”,这意味着整个表达式的计算结果为false,并且if
语句的主体不会执行,因此永远不会调用g
,d
的值保持不变。