访问变量时,Ruby 中的回退机制首先查找局部变量,如果找不到,它会自动应用self
并查找实例变量。但是,以下代码不起作用:
class My
def init
@abc = "abc"
end
def pt
puts abc
end
end
当我尝试调用pt
实例时收到此错误消息:
2.0.0-p247 :009 > my = My.new
=> #<My:0x007f9b5a1b1000>
2.0.0-p247 :010 > my.init
=> "abc"
2.0.0-p247 :011 > my.pt
NameError: undefined local variable or method `abc' for #<My:0x007f9b5a1b1000 @abc="abc">
但是,@abc
确实作为对象中的实例变量存在:
2.0.0-p247 :012 > my.instance_variables
=> [:@abc]
那为什么这里pt
找不到abc
呢?它不应该自动查找实例变量,因为它不是在本地定义的,然后打印出来吗?
笔记:
我知道使用puts @abc
会起作用,但这不是我的问题的重点。我的问题是关于 Ruby 中的后备机制。此代码有效:
2.0.0-p247 :079 > class My
2.0.0-p247 :080?> def initialize(param)
2.0.0-p247 :081?> @abc = param
2.0.0-p247 :082?> end
2.0.0-p247 :083?>
2.0.0-p247 :084 > def printabc
2.0.0-p247 :085?> puts abc
2.0.0-p247 :086?> end
2.0.0-p247 :087?> end
2.0.0-p247 :089 > My.new("haha").printabc
haha
I don't know why it doesn't work in the previous case but works in the latter.