2015-04-26 25 views
0

我無法理解的是試圖瞭解Ruby的吸氣二傳手規則

高清初始化(awesome_level2) @ awesome_level2 = awesome_level2

請問@ awesome_level2都具有相同的名稱awesome_level2?

好像如果我改變它,它不能正常工作

class Awesome 
     attr_accessor :awesome_level2 
    def initialize(awesome_level2) 
     p awesome_level2 #100 
     @awesome_level2 = awesome_level2 
     P @awesome_level2 #100 
    end 
end 

awesome_sauce = awesome.new(100) 
puts awesome_sauce.awesome_level2 #100 where is awesome_level2 from? 
awesome_sauce.awesome_level = 99 
puts awesome_sauce.awesome_level #99 
+0

這些輸出是什麼?你在期待什麼?我認爲你在初始化方法中有一個額外的大寫字母A – Prescott

回答

0

attr_accessor是爲您創建作爲參數傳遞的符號getter和setter方法的便捷方法。然後您可以直接訪問它創建的實例變量,在這種情況下爲@awesome_level2。請注意,它前面有@符號,表示它是一個實例變量。這與本地變量或沒有@符號的方法參數不同。因此,在初始化方法中,變量名稱@awesome_list2awesome_list2是不同的,可以保存不同的值。

正如@Prescott說,它好像你試圖設置你的實例變量@awesome_list2傳遞給你的初始化,awesome_list2的說法,卻意外地用大寫的A,這僅僅是將其設置爲寫零,因爲名稱爲Awesome_list2(注意大寫'A')的對象不存在(我認爲)。

+0

當我嘗試輸入它不在我的代碼中的問題時,「A」被放入。我可以命名@ awesome_level2與awesome_level2不同嗎?或者它是一樣的,因爲它是一個實例級別。 –

+0

我想我得到它,因爲我有attr_accessor = awesome_level2。我必須將其稱爲@ aweome_level2。我認爲這兩個必須是一樣的。是對的嗎? –

+0

@StacyProficy是的,這是正確的。調用'attr_accessor:foobar'將創建getter和setter方法以及名爲'@ foobar'的實例變量。也許[這個流行的SO線程](http://stackoverflow.com/a/4371458/3259320)解釋'attr_accessor'將有助於澄清事情? –