ruby笔记 基于对象的类(object specific class)

该笔记旨在帮助理解Ruby语言中“<<”指令。此指令可在对象基础上定义类,扩展单个对象行为且不影响同类型其他对象,还能用来临时修改对象、定义类方法。在Ruby里,对类的唯一实例metaclass扩展,与直接给类增加方法效果相同。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

此笔记是为了帮助理解 "<<" 指令
ruby语言允许我们在一个对象的基础上定义类,使得我们可以单独扩展一个对象的行为,例子如下

None.giftest="hello" #普通string 
None.gif
normal=a.dup #还是普通string 
None.gif
class << test 
None.gif        
def to_s 
None.gif                
"value is #{self}" 
None.gif        end 
None.gifend        
#test对象已经被更新, normal保持不变 

运行完上述代码以后

normal.to_s =="hello" 
test.to_s
=="value is hello" 

从这个例子上来看, 此时的test对象的类已经被扩展为新的to_s方法,但是这个扩展只能影响到test对象自己 ,其他的string对象还是原来的方法.

我的理解: 基于对象的类通过指令"<<" 来定义, 他能够扩展并且只能扩展被定义的对象, 同时不能影响系统中其他同类型的对象
"<<"指令可以用来临时修改一个对象,此外,这个指令还可以用来定义类的方法, 一般定义类方法是通过如下语法

class Test 
        
def Test.say 
                
"hello" 
        end 
end

如果嫌需要写多次类名麻烦,可以通过self替换

class Test 
        
def self.say 
                
"hello" 
        end 
end

有了"<<"指令,还可以这样来

class Test 
        
class << self 
                
def say 
                        
"hello" 
                end 
        end 
end

上述三者的定义是等价的,而且在ruby源代码中很容易看到第三种用法
 
解释: 在ruby中,每一个类都有一个唯一实例的metaclass. 类定义的方法都存在这个metaclass中
通过"<<"对这个唯一实例的metaclass作扩展,给metaclass增加方法和直接给这个类增加方法是一样的效果

转载于:https://www.cnblogs.com/baoz/archive/2005/11/19/2269884.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值