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=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=="value is hello"
从这个例子上来看, 此时的test对象的类已经被扩展为新的to_s方法,但是这个扩展只能影响到test对象自己 ,其他的string对象还是原来的方法.
我的理解: 基于对象的类通过指令"<<" 来定义, 他能够扩展并且只能扩展被定义的对象, 同时不能影响系统中其他同类型的对象
"<<"指令可以用来临时修改一个对象,此外,这个指令还可以用来定义类的方法, 一般定义类方法是通过如下语法
class Test
def Test.say
"hello"
end
end
def Test.say
"hello"
end
end
如果嫌需要写多次类名麻烦,可以通过self替换
class Test
def self.say
"hello"
end
end
def self.say
"hello"
end
end
有了"<<"指令,还可以这样来
class Test
class << self
def say
"hello"
end
end
end
class << self
def say
"hello"
end
end
end
上述三者的定义是等价的,而且在ruby源代码中很容易看到第三种用法
解释: 在ruby中,每一个类都有一个唯一实例的metaclass. 类定义的方法都存在这个metaclass中
通过"<<"对这个唯一实例的metaclass作扩展,给metaclass增加方法和直接给这个类增加方法是一样的效果