Ruby赋值vs表达式修饰符优先级

时间:2015-01-20 19:29:39

标签: ruby

我在MRI 2.0和jruby 1.7.16.1中都看到了以下行为:

irb(main):001:0> a 
NameError: undefined local variable or method `a' for main:Object
        from (irb):1
        from /usr/bin/irb:12:in `<main>'
irb(main):002:0> a = 2 unless true
=> nil
irb(main):003:0> a
=> nil
irb(main):004:0>

我希望a保持未定义,因为=的优先级高于unless。我错过了什么?

2 个答案:

答案 0 :(得分:0)

a = 2 unless true的评估如下:

unless true
  a = 2
end

优先级不起作用,因为它的范围不同。

答案 1 :(得分:0)

a  #=>NameError: undefined local variable or method `a' for main:Object

解析器无法确定这是否是局部变量OR METHOD,如错误所示。

a = 2 unless true

这里解析器能够识别出这是一个变量,并且它被定义(未初始化)。如果执行该语句,它将被初始化。未初始化的变量评估为零。