什么时候使用自己

大多数 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