2

我已经阅读了一些内容,包括thisthis,但我认为下面的示例与他们所说的不同。一个人实际上在讨论中提出了一个类似的例子,但它被忽略了。

因此,在 irb 中运行(忽略条件中有关赋值的警告):

(puts x) if (x = 0) # NameError: undefined local variable or method `x'...
x                   # => 0
(puts x) if (x = 0) # "0", => nil

但第二次没有错误。

这是否有意义,即使以“一旦您了解解析器真正在做什么并且这只是一些优化一切都会变得清晰”的方式?因为对我来说,这似乎很不受欢迎。

需要明确的是,上述条件应该等价于(对吗?)

if newvar=0
  puts newvar
end

这不会引发错误。


更新:自从提出这个问题以来,关于这个主题的帖子甚至更多。例如,
http://seejohncode.com/2012/07/31/ruby-gotcha-single-line-conditionals/

4

4 回答 4

1

奇怪的是,这在 Rubinius 中运行良好:

Welcome to IRB. You are using rubinius 1.2.4dev (1.8.7 7ae451a1 yyyy-mm-dd JI)
>> (puts x) if (x = 0) #=> nil
0

我倾向于说这是 MRI 中一个奇怪的解析错误。

于 2011-08-12T06:34:45.927 回答
1

我认为这种情况下的区别在于解析行时变量是否存在。如果是:

if x=0
  puts x
end

变量 x 在解析使用 x 的行之前定义。

换句话说,错误消息是解析时错误,而不是运行时错误。

于 2011-08-12T09:23:55.917 回答
0

我认为在此您将 0 分配给 x。

(puts x) if (x = 0)

我认为应该是

(puts x) if (x == 0)
于 2011-08-12T06:22:22.297 回答
0

首先,检查您的意思是x=0在条件从句中。

二、puts x if x = 0不等于:

if x = 0
  puts x
end

在您的情况下, x 尚未声明,puts x因此它看不到它。

于 2011-08-12T06:38:02.303 回答