锁定老帖子 主题:玩转Ruby系列:玩转metaclass
精华帖 (0) :: 良好帖 (0) :: 新手帖 (5) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-07-08
看了好几天meta-programming相关的资料,什么是metaclass就搞得有点头大,现在终于有点头绪。 在看metaclass之前,要弄清楚几个概念:
在ruby中,每一个对象实际上有两个对象:
obj = Object.new def obj.method_belong_to_obj self #=>obj end 在给obj对象定义方法的时候,ruby会自动创建一个单例类obj',这个类是不可见的,保存obj自己的方法.obj'用来修改obj对象的状态,比如添加方法,这也呼应上面的第3点"对象用来重新定义它自己的类".
Class Test def instance_method #=>Test的实例 end def Test.class_method self #=>Test end end 类方法是属于类对象的方法,也应该是由单例类定义的,所以在def Test.class_method的时候,ruby就创建了Test'的单例类。
class Test class << self def which_method self #=>Test end end end 我们可以用class << Test来打开Test对象的metaclass,所以which_method是类方法。
ruby通过metaclass来实现动态,meta-programming就是以metaclass为基础,弄清楚了什么是metaclass,就可以开始你的meta-programming之旅了。
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-07-09
其实ruby里面没有class method这个东西。所谓的class method只是对象的singleton method。
之所以叫class method是因为这个对象本身就是一个Class的实例。 仔细看看下面的代码: T = Class.new class << T def singleton_method_of_obj_T p self end end t = T.new class << t def singleton_method_of_obj_t p self end end T.singleton_method_of_obj_T t.singleton_method_of_obj_t 所以我觉得ruby里面真实存在的只有singleton method和instance method。至于class method只是为了便于理解吧。 引用 在ruby中,每一个对象实际上有两个对象: 多个对象实例共享的类 单例类 这句话也证明了我上面的结论。 多个对象实例共享的类,对应instance method 单例类,对应singleton method 至于还有人说ruby里面singleton method也不存在这就有点牵强了,因为singleton method无法让多个实例共享。可以看看这个贴http://stackoverflow.com/questions/1094689/is-there-a-difference-between-the-ways-of-defining-a-ruby-class-method |
|
返回顶楼 | |
发表时间:2009-07-10
最后修改:2009-07-10
你们2个说了老半天,无非就是“在ruby中一切都是对象”
类也是对象,你换个角度思考问题就可以了,ruby强调简单编程,根本没有你们描述的那样晦涩! |
|
返回顶楼 | |
发表时间:2009-07-10
下一站,火星 写道 你们2个说了老半天,无非就是“在ruby中一切都是对象”
类也是对象,你换个角度思考问题就可以了,ruby强调简单编程,根本没有你们描述的那样晦涩! 话是这样说,理解内部的原理,才能真正理解“一切都是对象” |
|
返回顶楼 | |
发表时间:2009-07-10
最后修改:2009-07-10
下一站,火星 写道 你们2个说了老半天,无非就是“在ruby中一切都是对象”
类也是对象,你换个角度思考问题就可以了,ruby强调简单编程,根本没有你们描述的那样晦涩! 没看明白.... 你这比我说的晦涩多了。 强调简单编程和讨论下类有冲突吗 只听说过“信春哥无bug”,没听说过“信简单编程无bug”,“信一切都是对象无bug”... |
|
返回顶楼 | |
发表时间:2009-07-10
最后修改:2009-07-10
Hooopo 写道 下一站,火星 写道 你们2个说了老半天,无非就是“在ruby中一切都是对象”
类也是对象,你换个角度思考问题就可以了,ruby强调简单编程,根本没有你们描述的那样晦涩! 没看明白.... 你这比我说的晦涩多了。 强调简单编程和讨论下类有冲突吗 只听说过“信春哥无bug”,没听说过“信简单编程无bug”,“信一切都是对象无bug”... “在ruby中一切都是对象”,你显然不能看明白,这个需要深厚的面向对象的功底 你需要从意识的角度去思考问题,一切问题都迎刃而解了 我以为,学习ruby最主要需要考虑到是思想和理念,做一个实战派的意识流很重要 如果你真的那么喜欢窥探其原理,可以读下ruby的源码,任何就要ruby源码以上的东西其实还是对ruby思想的理解,根本到达不了ruby原理以及机制的层次 |
|
返回顶楼 | |
发表时间:2009-07-10
下一站,火星 写道 Hooopo 写道 下一站,火星 写道 你们2个说了老半天,无非就是“在ruby中一切都是对象”
类也是对象,你换个角度思考问题就可以了,ruby强调简单编程,根本没有你们描述的那样晦涩! 没看明白.... 你这比我说的晦涩多了。 强调简单编程和讨论下类有冲突吗 只听说过“信春哥无bug”,没听说过“信简单编程无bug”,“信一切都是对象无bug”... “在ruby中一切都是对象”,你显然不能看明白,这个需要深厚的面向对象的功底 你需要从意识的角度去思考问题,一切问题都迎刃而解了 我以为,学习ruby最主要需要考虑到是思想和理念,做一个实战派的意识流很重要 如果你真的那么喜欢窥探其原理,可以读下ruby的源码,任何就要ruby源码以上的东西其实还是对ruby思想的理解,根本到达不了ruby原理以及机制的层次 不知道实战派的意意识流怎样理解,是这样吗: http://www.iteye.com/problems/19838 http://www.iteye.com/problems/20242 您不防去问答频道看看,还有很多人连类变量实例变量怎么访问都不知道就开始元编程... 意识和理念是在对语言本身有一定得理解基础上的,脱离理论空谈实践毫无意义。 我才不喜欢探究原理,但是当我出了问题时我会弄清究竟是怎么回事,避免下次再犯。 |
|
返回顶楼 | |
发表时间:2009-07-10
Hooopo 写道 下一站,火星 写道 Hooopo 写道 下一站,火星 写道 你们2个说了老半天,无非就是“在ruby中一切都是对象”
类也是对象,你换个角度思考问题就可以了,ruby强调简单编程,根本没有你们描述的那样晦涩! 没看明白.... 你这比我说的晦涩多了。 强调简单编程和讨论下类有冲突吗 只听说过“信春哥无bug”,没听说过“信简单编程无bug”,“信一切都是对象无bug”... “在ruby中一切都是对象”,你显然不能看明白,这个需要深厚的面向对象的功底 你需要从意识的角度去思考问题,一切问题都迎刃而解了 我以为,学习ruby最主要需要考虑到是思想和理念,做一个实战派的意识流很重要 如果你真的那么喜欢窥探其原理,可以读下ruby的源码,任何就要ruby源码以上的东西其实还是对ruby思想的理解,根本到达不了ruby原理以及机制的层次 不知道实战派的意意识流怎样理解,是这样吗: http://www.iteye.com/problems/19838 http://www.iteye.com/problems/20242 您不防去问答频道看看,还有很多人连类变量实例变量怎么访问都不知道就开始元编程... 意识和理念是在对语言本身有一定得理解基础上的,脱离理论空谈实践毫无意义。 我才不喜欢探究原理,但是当我出了问题时我会弄清究竟是怎么回事,避免下次再犯。 我发现你的表达能力有问题,理解也有一定的问题,我的意思是,先理解意识和理念在去学习一门语言,而不是反过来,为什么说有些人学完一门语言可以很快的上手另一门语言?是因为他学会了一种思想或者理念,所以也充分解释了一些垒了小半辈子代码的人,却始终没有长足的进步 |
|
返回顶楼 | |
发表时间:2009-07-10
引用 “在ruby中一切都是对象”,你显然不能看明白,这个需要深厚的面向对象的功底
我为什么会看不明白,深厚的OO功底这个不敢说... 但是,ruby是我的入门编程语言,我没有过任何其他非OO语言背景。。。 |
|
返回顶楼 | |
发表时间:2009-07-10
最后修改:2009-07-10
Hooopo 写道 引用 “在ruby中一切都是对象”,你显然不能看明白,这个需要深厚的面向对象的功底
我为什么会看不明白,深厚的OO功底这个不敢说... 但是,ruby是我的入门编程语言,我没有过任何其他非OO语言背景。。。 所以说,java适合做教材语言,这句话非常有道理! 总体来说,ruby的理念还是非常好接受的,在比如在ruby中类是对象,我比较赞同,首先类具有类变量 类方法,具有属性和行为,就应该可以是对象,赞 相比,python中函数也是对象,日,在java中,类就是类 |
|
返回顶楼 | |