訪問變量時,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
我不知道爲什麼它在前一種情況下不起作用,但在後者中起作用。
你的第二個例子也將拋出錯誤.. –
你的第二個例子會拋出一個錯誤了。 – Nobita
鑑於行號,我懷疑它工作的原因是'abc'已被定義爲更高 –