尽管条件定义的变量应该阻止它
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 = ...
,您告诉解释器声明名称 somevar
。 nil
不一样(如果这有意义的话)。
然而,[]
运算符并未声明变量(仅访问),但由于 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
今天我遇到了一段有趣的代码。它更像是一个关于 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 = ...
,您告诉解释器声明名称 somevar
。 nil
不一样(如果这有意义的话)。
然而,[]
运算符并未声明变量(仅访问),但由于 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