ruby的动态性

记住: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

类对象的单例类有时被称为元类,有时“元类”也泛指所有的单例类。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值