为什么Ruby中的postfix`if`工作如此奇怪

时间:2017-07-28 14:55:21

标签: ruby if-statement

我在Ruby中有一个奇怪的行为:

var1.zero? if var1 = 1
  

NameError:未定义的局部变量或方法var1 for main:Object

另一方面,如果我在标准if中做同样的事情,那么所有工作都按预期进行:

if var1 = 1
  var1.zero?
end
# => false

任何人都可以描述Ruby中的后缀if如何工作?

3 个答案:

答案 0 :(得分:4)

因为如果我问你

  

我女儿不可爱......

你会打扰我

  

你有女儿吗?

在我完成我的初始判决之前

  

我女儿不可爱,这是她的[显示图片]

但如果我问你

  

[显示图片]这是我的女儿,是不是很可爱

您可以轻松回复

  

没有

答案 1 :(得分:2)

这是因为局部变量在赋值后可用(并且按词法顺序而不是按执行顺序完成)。

因此postfix-if的condition子句不会更改其主体中可用的可用局部变量的列表。但实际上它是一个任务。您可以通过忽略异常并检查var1值来检查它:

var1.zero? rescue nil if var1 = 1
puts(var1)

您还可以注意到实例变量以不同的方式工作:它们不会引发未定义变量的错误。

有关其他信息,请查看ruby bug跟踪器中的issue

答案 2 :(得分:0)

它会从左到右,首先会显示var1.zero?,然后是if var1 = 1

var1.zero? if var1 = 1

这就是var1

的原因
  

NameError:未定义的局部变量或方法`var1' for main:Object

在这里,

if var1 = 1
  var1.zero?
end

var1 = 1将创建值为1的var1,因此它不会抛出错误。当它执行var1.zero?时。