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 @ 2005-11-19 17:01  tech.cap  阅读(196)  评论(0编辑  收藏  举报