为什么这会返回`nil`或数组?

时间:2015-07-26 17:58:24

标签: ruby

以下代码似乎随机返回dnil的预期数组。

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

1 个答案:

答案 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 == 

所以你可能想知道,如果我使用了错误的操作符,为什么我的代码完全可以工作?

您的代码仍然可以执行,因为

  1. 作业是表达式,意味着它们会返回值。
  2. 所有值都可以评估为“true”或“false”(真实或虚假)。
  3. 这意味着,在您的代码中,除了分配变量之外,a = f(x)b = f(y)c = f(z)每个都会返回一个值

    在每种情况下,返回的值分别与分配的值相同:true"two"false。因此,您的if语句正在评估此条件:

    true and "two" and false
    

    在Ruby中,除了falsenil之外,所有值都是“真实的”。

    字符串“two”是真实的,因为它既不是false也不是nil。但是,false当然是“假的”,这意味着整个表达式的计算结果为false,并且if语句的主体不会执行,因此永远不会调用gd的值保持不变。