Calvert's murmur

什麼時候應該在類別內使用 self

2018-07-31

約 1264 字 / 需 7 分鐘閱讀

在 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

此處的 barself.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 會讀取區域變數而不是呼叫該方法。


參考資料

Tags: Ruby