今天我看到一段有趣的代码。这更像是一个关于ruby解析器的科学问题。我们知道ruby中的所有东西都是对象,每个表达式的计算结果至少是nil
。但是下面的"作业"怎么样?解析:
somevar
NameError: undefined local variable or method 'somevar' for main:Object
somevar = "test" if false
=> nil
somevar
=> nil
在赋值操作中使用变量之前,变量是未定义的。但由于条件的原因,作业没有进行。还是因为条件的结果是nil?我尝试了一些在这种情况下会破裂的东西,但它只是工作:
a = {}
a[1/0]
ZeroDivisionError: divided by 0
a[1/0] = "test" if false
=> nil
那么,这意味着它的工作方式吗?或者在访问之前测试变量(defined?(somevar)
)是否有意义,以防将来的ruby版本会破坏这种行为?例如,通过保存分配给这个变量的指针。我目前使用的ruby版本是3.0.2。
这是Ruby中预期的行为。引用自Ruby文档:
本地变量在解析器遇到赋值时创建,而不是在赋值发生时创建:
a = 0 if false # does not assign to a p local_variables # prints [:a] p a # prints nil
如果执行= "test" if false
,则计算结果为nil
=>不需要分配任务。但是通过调用somevar = ...
,你告诉解释器声明名称somevar
。nil
是不一样的(如果这有意义的话)。
[]
操作符不声明变量(只访问),但由于if false
不为真,因此没有赋值,因此整个左侧不计算。
考虑:
a = [1,2,3]
a[1] = "test" if false
a
=> [1,2,3]
a[1]
既不是nil也不是test.
不确定你期望什么或者未来的Ruby会如何打破这个?