如果测试工作,为什么不内联?

时间:2012-03-19 11:19:40

标签: ruby

我有一个内联,如果没有按照我的想法进行操作,为了清晰起见,我已将其提取到控制台示例中。

我认为内联if在语法上与多行if相同,但它看起来不是。

foo = "chunky"
(bar1 = foo) if (!defined?(bar1) && foo)
bar1

在这种情况下,bar1最终设置为nil。如果我将其重组为

foo = "chunky"
if !defined?(bar2) && foo
  bar2 = foo
end
bar2

然后它工作 - bar2设置为“chunky”(我在第二个例子中使用了bar2而不是bar1,以确保我在每种情况下都使用了未定义的变量)。

是否内联如果总是将bar1设置为某个东西,默认为零?如果if测试返回falsy,我认为它只是没有评估if之前的部分。

1 个答案:

答案 0 :(得分:7)

它失败了,因为只要在作业的左侧看到一个裸字,它就会被初始化为nil。因此,当您执行(bar1 = foo) if (!defined?(bar1) && foo)时,bar1nil检查defined?。这是一个简化的例子:

>> defined? foo
=> nil
>> foo = 1 if false
=> nil
>> foo
=> nil
>> defined? foo
=> "local-variable"