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

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

test="hello" #普通string 
normal=a.dup #还是普通string 
class << test 
        
def to_s 
                
"value is #{self}" 
        end 
end        
#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增加方法和直接给这个类增加方法是一样的效果

posted @   tech.cap  阅读(198)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示