2012-03-19 23 views
4

我有一个内联,如果哪个没有做我认为的事情,我已经将它提炼成了一个控制台示例以便清楚。为什么测试工作时不内联?

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

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

在这种情况下,BAR1最终设定为零。如果我把它重组到

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

那么它的工作原理 - BAR2被设置为“矮胖”(我用BAR2而不是在第二个例子中BAR1以确保我使用一个未定义的变量在每种情况下)。

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

+0

相关问题(可能是重复的 - 不能告诉):http://stackoverflow.com/questions/3775402/rubys-foo-true-if-defined-foo-wont-work -as-expected – 2012-03-19 21:55:22

回答

7

它失败了,因为只要在作业的左侧看到裸词,它就会初始化为nil。因此当你做(bar1 = foo) if (!defined?(bar1) && foo)时,bar1将会在defined?检查中为nil。这里有一个简单的例子:

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

This *“如果失败,因为只要在赋值的左侧看到一个裸词,它就会初始化为零。”*是我以前缺少的Ruby知识的关键位。谢谢! – 2012-03-19 11:48:07

相关问题