论坛首页 编程语言技术论坛

玩转Ruby系列:玩转metaclass

浏览 5807 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (5) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-07-08  

看了好几天meta-programming相关的资料,什么是metaclass就搞得有点头大,现在终于有点头绪。

在看metaclass之前,要弄清楚几个概念:

  1. 类也是个对象,叫做类对象,类对象是Class的实例.
  2. Class也是类对象,也是Class的实例,但不会无限循环,ruby内部会处理.
  3. metaclass是定义类的类,如果这样理解,在ruby中metaclass就是Class,但事实不是,ruby中的metaclass最好理解成"对象用来重新定义它自己的类".
  4. ruby中的这个metaclass也可以叫做单例类singleton class(单个对像拥有的类)或eigen class.

 

在ruby中,每一个对象实际上有两个对象:

  1. 多个对象实例共享的类
  2. 单例类

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之旅了。

 

  • 大小: 91.6 KB
  • 大小: 82.9 KB
   发表时间: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

0 请登录后投票
   发表时间:2009-07-10   最后修改:2009-07-10
你们2个说了老半天,无非就是“在ruby中一切都是对象”
类也是对象,你换个角度思考问题就可以了,ruby强调简单编程,根本没有你们描述的那样晦涩!
0 请登录后投票
   发表时间:2009-07-10  
下一站,火星 写道
你们2个说了老半天,无非就是“在ruby中一切都是对象”
类也是对象,你换个角度思考问题就可以了,ruby强调简单编程,根本没有你们描述的那样晦涩!

话是这样说,理解内部的原理,才能真正理解“一切都是对象”
0 请登录后投票
   发表时间:2009-07-10   最后修改:2009-07-10
下一站,火星 写道
你们2个说了老半天,无非就是“在ruby中一切都是对象”
类也是对象,你换个角度思考问题就可以了,ruby强调简单编程,根本没有你们描述的那样晦涩!

没看明白....

你这比我说的晦涩多了。

强调简单编程和讨论下类有冲突吗
只听说过“信春哥无bug”,没听说过“信简单编程无bug”,“信一切都是对象无bug”...
0 请登录后投票
   发表时间:2009-07-10   最后修改:2009-07-10
Hooopo 写道
下一站,火星 写道
你们2个说了老半天,无非就是“在ruby中一切都是对象”
类也是对象,你换个角度思考问题就可以了,ruby强调简单编程,根本没有你们描述的那样晦涩!

没看明白....

你这比我说的晦涩多了。

强调简单编程和讨论下类有冲突吗
只听说过“信春哥无bug”,没听说过“信简单编程无bug”,“信一切都是对象无bug”...

“在ruby中一切都是对象”,你显然不能看明白,这个需要深厚的面向对象的功底
你需要从意识的角度去思考问题,一切问题都迎刃而解了

我以为,学习ruby最主要需要考虑到是思想和理念,做一个实战派的意识流很重要
如果你真的那么喜欢窥探其原理,可以读下ruby的源码,任何就要ruby源码以上的东西其实还是对ruby思想的理解,根本到达不了ruby原理以及机制的层次
0 请登录后投票
   发表时间: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

您不防去问答频道看看,还有很多人连类变量实例变量怎么访问都不知道就开始元编程...
意识和理念是在对语言本身有一定得理解基础上的,脱离理论空谈实践毫无意义。

我才不喜欢探究原理,但是当我出了问题时我会弄清究竟是怎么回事,避免下次再犯。

0 请登录后投票
   发表时间: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

您不防去问答频道看看,还有很多人连类变量实例变量怎么访问都不知道就开始元编程...
意识和理念是在对语言本身有一定得理解基础上的,脱离理论空谈实践毫无意义。

我才不喜欢探究原理,但是当我出了问题时我会弄清究竟是怎么回事,避免下次再犯。


我发现你的表达能力有问题,理解也有一定的问题,我的意思是,先理解意识和理念在去学习一门语言,而不是反过来,为什么说有些人学完一门语言可以很快的上手另一门语言?是因为他学会了一种思想或者理念,所以也充分解释了一些垒了小半辈子代码的人,却始终没有长足的进步
0 请登录后投票
   发表时间:2009-07-10  
引用
“在ruby中一切都是对象”,你显然不能看明白,这个需要深厚的面向对象的功底


我为什么会看不明白,深厚的OO功底这个不敢说...

但是,ruby是我的入门编程语言,我没有过任何其他非OO语言背景。。。

0 请登录后投票
   发表时间:2009-07-10   最后修改:2009-07-10
Hooopo 写道
引用
“在ruby中一切都是对象”,你显然不能看明白,这个需要深厚的面向对象的功底


我为什么会看不明白,深厚的OO功底这个不敢说...

但是,ruby是我的入门编程语言,我没有过任何其他非OO语言背景。。。



所以说,java适合做教材语言,这句话非常有道理!

总体来说,ruby的理念还是非常好接受的,在比如在ruby中类是对象,我比较赞同,首先类具有类变量 类方法,具有属性和行为,就应该可以是对象,赞

相比,python中函数也是对象,日,在java中,类就是类

0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics