在 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
會讀取區域變數而不是呼叫該方法。
參考資料