记住:Ruby的动态特性是以self身份的转换为基础的。
单例类
先来看看什么是单例类。大多数Ruby程序中发生的都涉及包含实例方法定义的类和模块:
class C
def talk
puts "Hi!"
end
end
使用下面的方法实例化和实例方法调用:
c = C.new
c.talk
还可以直接给单个对象添加方法:
obj = Object.new
def obj.talk
puts "Hi!"
end
obj.talk
像这样在特定对象上添加的方法称为单例方法。如果为一个给定的对象定义了单例方法,那么只有该对象可以调用该方法。
单例方法最常见的是类方法(因为普通的类也是对象,又称类对象,这些类都是Class类的实例):
class Ticket
def Ticket.most_expensive(tickets)
end
end
单例方法定义在何处
对象的单例方法定义在对象的单例类中。每一个对象实际上有两上类:
* 多个对象实例共享的类
* 单例类
可以将某个对象的单例类看作是它独有的方法保存区,仅仅由对象拥有,其他对象不能分防享。
直接检查和修改单例类
单例类是匿名的。使用下面的记法来打开单例类的定义:
class << object
# method and constant definitions here
end
<<object记法表明是object的匿名单例类。例:
str = " I am string"
class << str
def twice
self + " " + self
end
end
puts str.twice
输出:I am a string I am string
twice方法是str的单例方法。用下面的代码,效果是一样的:
def str.twice
self + " " + self
end
使用class << 定义类方法:
class Ticket
class << self
def most_expensive(tickets)
end
end
end
class << self经常用来定义类方法(此时的self是这个类对象本身)。
不管是什么对象,都可以使用该技术打开对象的单例类的定义体。这意味着,在这个定义体内所做的事都属于该对象。
方法查找路径上的单例类
对象的单例类出现在方法查找路径上的第一个位置。单例类是对象的个人方法存储区,所以最先搜索。由单例类混含进来的模块,先于对象所属类查找,也先于对象所属类混含的任何模块查找。
以上的意思是说:在方法查找的时候,单例类的内容永远优先于其他查找。
深入类方法
类方法是为Class类的对象定义的单例方法。在很多方面和其他的单例方法相似,但也有它特别的地方:为类对象定义的单例言法可以被该类的子类调用。
class C
end
def C.a_class_method
puts "Singleton method defined on C"
end
C.a_class_method
class D < C
D.a_class_method
类对象的单例类有时被称为元类,有时“元类”也泛指所有的单例类。
单例类
先来看看什么是单例类。大多数Ruby程序中发生的都涉及包含实例方法定义的类和模块:
class C
def talk
puts "Hi!"
end
end
使用下面的方法实例化和实例方法调用:
c = C.new
c.talk
还可以直接给单个对象添加方法:
obj = Object.new
def obj.talk
puts "Hi!"
end
obj.talk
像这样在特定对象上添加的方法称为单例方法。如果为一个给定的对象定义了单例方法,那么只有该对象可以调用该方法。
单例方法最常见的是类方法(因为普通的类也是对象,又称类对象,这些类都是Class类的实例):
class Ticket
def Ticket.most_expensive(tickets)
end
end
单例方法定义在何处
对象的单例方法定义在对象的单例类中。每一个对象实际上有两上类:
* 多个对象实例共享的类
* 单例类
可以将某个对象的单例类看作是它独有的方法保存区,仅仅由对象拥有,其他对象不能分防享。
直接检查和修改单例类
单例类是匿名的。使用下面的记法来打开单例类的定义:
class << object
# method and constant definitions here
end
<<object记法表明是object的匿名单例类。例:
str = " I am string"
class << str
def twice
self + " " + self
end
end
puts str.twice
输出:I am a string I am string
twice方法是str的单例方法。用下面的代码,效果是一样的:
def str.twice
self + " " + self
end
使用class << 定义类方法:
class Ticket
class << self
def most_expensive(tickets)
end
end
end
class << self经常用来定义类方法(此时的self是这个类对象本身)。
不管是什么对象,都可以使用该技术打开对象的单例类的定义体。这意味着,在这个定义体内所做的事都属于该对象。
方法查找路径上的单例类
对象的单例类出现在方法查找路径上的第一个位置。单例类是对象的个人方法存储区,所以最先搜索。由单例类混含进来的模块,先于对象所属类查找,也先于对象所属类混含的任何模块查找。
以上的意思是说:在方法查找的时候,单例类的内容永远优先于其他查找。
深入类方法
类方法是为Class类的对象定义的单例方法。在很多方面和其他的单例方法相似,但也有它特别的地方:为类对象定义的单例言法可以被该类的子类调用。
class C
end
def C.a_class_method
puts "Singleton method defined on C"
end
C.a_class_method
class D < C
D.a_class_method
类对象的单例类有时被称为元类,有时“元类”也泛指所有的单例类。