“if”条件的位置

时间:2013-08-14 12:16:59

标签: ruby

我想:

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

一般回答:

有几条评论希望使用||=运算符...如果foonil,那么这将无效:

foo ||= default_value

将返回默认值,同时定义foo

我坚持使用“不defined?”,这不等于nil

2 个答案:

答案 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?的结果。

为了在没有问题的情况下编写内联,我的方法是使用andor&&||

defined?(foo) or foo = default_value