尽管条件定义的变量应该阻止它

Variable defined despite condition should prevent it

今天我遇到了一段有趣的代码。它更像是一个关于 ruby 解析器的科学问题。 我们知道 ruby 中的所有内容都是一个对象,并且每个表达式的计算结果至少为 nil。 但是下面的“赋值”是如何解析的:

somevar
 NameError: undefined local variable or method 'somevar' for main:Object
somevar = "test" if false
 => nil
somevar
 => nil

您会看到该变量在赋值中使用之前是未定义的。但是由于条件的原因,分配没有发生。还是因为条件评估为零而发生?我尝试了一些在这种情况下会损坏的东西,但它确实有效:

a = {}
a[1/0]
 ZeroDivisionError: divided by 0
a[1/0] = "test" if false
 => nil

那么这是否意味着按原样工作?或者在访问之前测试变量 (defined?(somevar)) 是否有意义,以防 ruby 的未来版本会破坏这种行为?例如,将分配的指针保存到该变量。 我目前使用的ruby版本是3.0.2.

如果你这样做 = "test" if false 它的计算结果是 nil => 不需要赋值。但是通过调用 somevar = ...,您告诉解释器声明名称 somevarnil 不一样(如果这有意义的话)。

然而,[] 运算符并未声明变量(仅访问),但由于 if false 不正确,因此没有赋值,因此不会评估整个左侧。

考虑:

a = [1,2,3]
a[1] = "test" if false
a
=> [1,2,3]

a[1] 既不是零也不是测试。

不确定您的期望或未来 Ruby 将如何打破这一点?

这是 Ruby 中的预期行为。引自 Ruby docs:

The local variable is created when the parser encounters the assignment, not when the assignment occurs:

a = 0 if false # does not assign to a

p local_variables # prints [:a]

p a # prints nil