在 Ruby 類別內,你不知道什麼時候需要使用 self,而什麼時候又可以省略,本文將透過範例來做簡單的說明。
範例一
class Foo
attr_writer :bar
def do_something
bar = 123
end
end
在此範例中 bar = 123 會建立一個名稱為 bar 的區域變數,而不是呼叫由 attr_writer 所產生的 bar= 方法,只要加上 self 就可以修正這個問題。
class Foo
attr_writer :bar
def do_something
self.bar = 123
end
end
self.bar 便會呼叫我們所預期的 bar= 方法。
範例二
你也可以使用 self 來呼叫與區域變數名稱相同的屬性閱讀器:
class Foo
attr_reader :bar
def do_something
bar = 123
puts self.bar
end
end
此處的 bar 與 self.bar 分別為區域變數與實例變數,是兩個不同的東西,因此通常為了避免混淆,最好避免區域變數與存取器名稱相同。
範例三
class People
attr_accessor :name
def initialize
self.name = 'Calvert'
end
def greeting
"Hello, #{name}"
end
end
在這個範例中,可以看到在 greeting 方法中沒有使用 self 來讀取實例變數 name,因為 attr_accessor 會產生以下兩個方法,因此可以省略 self 來讀取 name:
def name
@name
end
def name=(new_name)
@name = new_name
end
結論
當呼叫設值方法時你必須使用 self.foo = 123 而不是 foo = 123,這樣 Ruby 才會知道你不是要嘗試建立一個新的區域變數。
同樣的,如果你有一個與區域變數相同名稱的方法 greeting,則必須使用 self.greeting 來呼叫該方法,因為使用 greeting 會讀取區域變數而不是呼叫該方法。
參考資料