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



今天我看到一段有趣的代码。这更像是一个关于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 = ...,你告诉解释器声明名称somevarnil是不一样的(如果这有意义的话)。

[]操作符不声明变量(只访问),但由于if false不为真,因此没有赋值,因此整个左侧不计算。

考虑:

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

a[1]既不是nil也不是test.

不确定你期望什么或者未来的Ruby会如何打破这个?

相关内容

  • 没有找到相关文章

最新更新