seft是Ruby语言的保留关键词,它始终保指向某一个object,但是它实际引用的对象却常常根据context的不同而变化。
当方法被调用而没有指明调用者,Ruby会将调用信息发送给self关键字所引用的对象。由于省略掉指明调用者而直接调用方法的情况非常普遍,所以弄清楚self关键字在当前所引用的对象是非常重要的。
self 最开始总是指向一个main实例,main是Object 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_name 和 Person#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
endRuby程序员喜欢利用这点,在编写代码时可以省时省力。