什麼時候使用自己

大多數 Ruby 程式碼都使用隱式接收器,因此 Ruby 新手的程式設計師經常對何時使用 self 感到困惑。實際的答案是 self 主要用於兩個方面:

1.更換接收器

通常,def 在類或模組中的行為是建立例項方法。Self 可以用來定義類的方法。

class Foo
  def bar
    1
  end

  def self.bar
    2
  end
end

Foo.new.bar #=> 1
Foo.bar #=> 2

2.消除接收者的歧義

當區域性變數可能與方法具有相同名稱時,可能需要顯式接收器消除歧義。

例子:

class Example
  def foo
    1
  end

  def bar
    foo + 1
  end

  def baz(foo)
    self.foo + foo # self.foo is the method, foo is the local variable
  end

  def qux
    bar = 2
    self.bar + bar # self.bar is the method, bar is the local variable
  end 
end

Example.new.foo    #=> 1
Example.new.bar    #=> 2
Example.new.baz(2) #=> 3
Example.new.qux    #=> 4

需要消除歧義的另一種常見情況涉及以等號結束的方法。例如:

class Example
  def foo=(input)
    @foo = input
  end

  def get_foo
    @foo
  end

  def bar(input)
    foo = input # will create a local variable
  end

  def baz(input)
    self.foo = input # will call the method
  end
end

e = Example.new
e.get_foo #=> nil
e.foo = 1
e.get_foo #=> 1
e.bar(2)
e.get_foo #=> 1
e.baz(2)
e.get_foo #=> 2