什麼是自我?我認爲這可能是一個訪問者
這是一個方法至少 - 可能是一個訪問者。 self.name = something
將調用方法name=
和self.name
,或者如果沒有稱爲name
的本地變量存在,則只需name
將調用方法name
。
但後來不能只是user_name而不是self.user_name?
當調用name=
方法,你需要的self
因爲name = something
只想創建一個名爲name
一個局部變量。當調用name
方法時,不管你是寫name
還是self.name
,除非還有一個局部變量name
。
我甚至沒有看到任何代碼使它成爲訪問器,比如attr_accessor,而不是在基類中。
如果有attr_accessor
沒有呼叫和name
和name=
沒有明確的定義,任何地方,他們可能會被method_missing
處理或超過attr_accessor
不同的方法來定義。
只有當它的定義是不self.user_name一樣@user_name
。如果您定義了user_name
和user_name=? using
attr_accessor they will get and set
@ user_name`。但是,如果您通過其他方式(或手動)定義它們,則可以執行任何您想要的操作。
例如ActiveRecord使用method_missing
來「定義」與數據庫列對應的getter和setter方法。因此,如果您的ActiveRecord類屬於包含user_name
列的表,則您將有user_name
和user_name=
方法,而無需在任何地方定義它們。由user_name
返回並由user_name =
設置的值也將不對應於實例變量。即將不會有名爲@user_name
的實例變量。
另一種方式來自動定義user_name
和user_name=
不使用實例變量是Struct
:
MyClass = Struct.new(:user_name)
這裏MyClass
將有方法user_name
和user_name=
,但沒有實例變量@user_name
將在任何時候進行設置。
其他答案給出了範圍,實例變量和局部範圍變量的一個好主意。閱讀這些問題是爲了對問題有一個很好的理解,他們遺漏的一件事就是'self'是對當前'範圍'的引用,當在一個實例中使用時,其他編程語言中'this'的ruby等價物方法,它引用當前實例,當在類方法中使用時,它引用該類。 – Jeremy 2010-10-22 11:30:57