我有一个内联,如果没有按照我的想法进行操作,为了清晰起见,我已将其提取到控制台示例中。
我认为内联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之前的部分。
答案 0 :(得分:7)
它失败了,因为只要在作业的左侧看到一个裸字,它就会被初始化为nil
。因此,当您执行(bar1 = foo) if (!defined?(bar1) && foo)
时,bar1
将nil
检查defined?
。这是一个简化的例子:
>> defined? foo
=> nil
>> foo = 1 if false
=> nil
>> foo
=> nil
>> defined? foo
=> "local-variable"