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
end
Ruby程序员喜欢利用这点,在编写代码时可以省时省力。