我想:
do_something if condition
相当于
if condition
do_something
end
我发现了一个不遵守此规则的代码。
if !(defined? foo)
foo = default_value
end
此处,foo
需要default_value
。
foo = default_value if !(defined? foo)
此处,foo
需要nil
。在前面的代码中,我认为if
首先执行,并且应该等同于:
foo = (default_value if !(defined? foo))
如果未定义变量,有没有办法设置为default_value
?
一般回答:
有几条评论希望使用||=
运算符...如果foo
为nil
,那么这将无效:
foo ||= default_value
将返回默认值,同时定义foo
。
我坚持使用“不defined?
”,这不等于nil
。
答案 0 :(得分:5)
Ruby方式是
foo ||= default_value
但是,当然
if (defined? foo)
foo = default_value
end
和
foo = default_value if !(defined? foo)
是不同的。你不是在比较同样的事情。
在一个比较(defined? foo)
和另一个比较!(defined? foo)
我认为你真正追求的是以下
if !(defined? foo)
foo = default_value
end
答案 1 :(得分:3)
这两段代码在语法上是等价的,但与解析的观点不同。你是部分正确的,“首先执行if
”,但这只是关于语法。在解析中,解析顺序遵循令牌的线性顺序。在Ruby中,当你有一个任务时:
foo = ...
然后foo
被分配nil
,即使该部分代码未经过语法评估,也会影响defined?
的结果。
为了在没有问题的情况下编写内联,我的方法是使用and
,or
,&&
或||
:
defined?(foo) or foo = default_value