如上,在 irb 上中就执行上面的代码,那么结果是什么呢?
首先,a 被赋值为 nil。
然后,报错:NoMethodError: undefined method `+' for nil:NilClass
而我期望的是它会报NameError: undefined local variable or method `a' for main:Object这样的错,然后停止对 a 赋值。
我没有看过 ruby 代码,猜想当代码执行到那一句时,先是解释"a=",没有 a 这个变量,于是乎创建一个 a 并赋值 nil,然后在"a+1"时 a 就是 nil。
上面的想法可以通过执行
b = b.nil?
来验证,会返回 true。
那么它带来的问题是当我在一个类中,想对一个方法的返回值进行处理然后赋值给同名的变量时,就会报错了。
有点儿绕口,看代码:
class C
def a
1
end
def add_wrong
a = a + 1
end
def add_right
a = self.a + 1
end
end
c = C.new
c.a #=> 1
c.add_wrong #=> NoMethodError: undefined method `+' for nil:NilClass
c.add_right #=> 2