1

我以为:

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定义。

我坚持使用“not defined?”,它不等于nil.

4

2 回答 2

5

红宝石的方式是

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
于 2013-08-14T12:22:32.400 回答
3

这两段代码在语法上是等价的,但从解析的角度来看是不同的。您部分正确,“if首先执行”,但这仅与语法有关。在解析中,解析顺序遵循标记的线性顺序。在 Ruby 中,当你有一个任务时:

foo = ...

即使那部分代码没有在语法上进行评估,foo也会分配then ,这会影响 . 的结果。nildefined?

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

defined?(foo) or foo = default_value
于 2013-08-14T12:37:01.533 回答