[翻译]理解ruby的self关键词

dark
LiinNs

原文链接

seft是Ruby语言的保留关键词,它始终保指向某一个object,但是它实际引用的对象却常常根据context的不同而变化。

当方法被调用而没有指明调用者,Ruby会将调用信息发送给self关键字所引用的对象。由于省略掉指明调用者而直接调用方法的情况非常普遍,所以弄清楚self关键字在当前所引用的对象是非常重要的。

self 最开始总是指向一个main实例,mainObject class的一个对象,由Ruby运行时自动创建。main是Ruby程序top-level的命名空间。

  p self # the main object

在定义一个新的class时,self指向class本身

  class Dog
    p self # the Dog class
  end

在定义单例方法时,self同样指向class本身

  class Dog
    def self.about
      self
    end
  end
  
  p Dog.about # Dog

定义实例方法时,self指向当前class的一个实例。

  class Dog
    def bark
      self
    end
  end
  
  p Dog.new.bark # an instance of the Dog class

定义module时,self指向mudule自身

  module Cab
    p self # Cab
  end

当在class定义中include module时,self指向引入module的那一个class的实例

  module Cab
    def hi
      self
    end
  end
  
  class Cat
    include Cab
  end
  
  p Cat.new.hi # instance of the Cat class

当一个方法直接调用未显式指定调用者时,就相当于在self上调用。如下例Person#full_name中,直接调用了Person#first_namePerson#last_name,这时self就指向当前调用full_name的实例。

  class Person
    attr_reader :first_name, :last_name
  
    def initialize(first_name, last_name)
      @first_name = first_name
      @last_name = last_name
    end
  
    def full_name
      "#{first_name} #{last_name}"
    end
  end

Ruby程序员喜欢利用这点,在编写代码时可以省时省力。