Ruby 我学习了一下,Ruby 新手可以看看

kevin__liu · 2012年05月31日 · 最后由 NoNZero 回复于 2012年06月02日 · 3116 次阅读

class MyClass
end
obj1 = MyClass.new
obj2 = MyClass.new


puts "1:==============================="
puts "obj1.class:#{obj1.class}"
#puts "obj1.superclass:#{obj1.superclass}"
puts "MyClass.class:#{MyClass.class}"
puts "MyClass.superclass:#{MyClass.superclass}"
puts "MyClass.class.superclass:#{MyClass.class.superclass}"
puts "MyClass.superclass.class:#{MyClass.superclass.class}"
puts "MyClass.class.superclass.class:#{MyClass.class.superclass.class}"
puts "Object.class:#{Object.class}"
puts "Object.superclass:#{Object.superclass}"
puts "Class.class:#{Class.class}"
puts "Class.superclass:#{Class.superclass}"
puts "Module.class:#{Module.class}"
puts "Module.superclass:#{Module.superclass}"

puts
puts
puts

puts "2:============================="
puts "Class:#{Class}"
puts "Class.superclass:#{Class.superclass}"
puts "Class.superclass.superclass:#{Class.superclass.superclass}"
puts "Class.superclass.superclass.superclass:#{Class.superclass.superclass.superclass}"
puts "Class.superclass.superclass.superclass.superclass:#{Class.superclass.superclass.superclass.superclass}"

puts
puts
puts

puts "3:============================="
puts "Class:#{Class}"
puts "Class.class:#{Class.class}"
puts "Class.class.class:#{Class.class.class}"
puts "Class.class.class.class:#{Class.class.class.class}"
puts "Class.class.class.class.class:#{Class.class.class.class.class}"

puts
puts
puts

puts "4:============================="
MyClass2 = Class.new
obj3 = MyClass2.new
puts "obj3.class:#{obj3.class}"

puts
puts
puts

puts "5:============================="
puts "obj1.object_id:#{obj1.object_id}"
puts "obj1.class.object_id:#{obj1.class.object_id}"
puts "MyClass.class.object_id:#{MyClass.class.object_id}"
puts "MyClass.superclass.object_id:#{MyClass.superclass.object_id}"
puts "MyClass.class.superclass.object_id:#{MyClass.class.superclass.object_id}"

Ruby1.9.3 下的运行结果:

1:=============================== obj1.class:MyClass MyClass.class:Class MyClass.superclass:Object MyClass.class.superclass:Module MyClass.superclass.class:Class MyClass.class.superclass.class:Class Object.class:Class Object.superclass:BasicObject Class.class:Class Class.superclass:Module Module.class:Class Module.superclass:Object

2:============================= Class:Class Class.superclass:Module Class.superclass.superclass:Object Class.superclass.superclass.superclass:BasicObject Class.superclass.superclass.superclass.superclass:

3:============================= Class:Class Class.class:Class Class.class.class:Class Class.class.class.class:Class Class.class.class.class.class:Class

4:============================= obj3.class:MyClass2

5:============================= obj1.object_id:22010796 obj1.class.object_id:22010832 MyClass.class.object_id:3351168 MyClass.superclass.object_id:3351216 MyClass.class.superclass.object_id:3351192

Metaprogram?

这算不上元编程,增强一下对 Ruby 的对象模型的一点点认识吧。 我认为怎么讲不重要,理解就好了,看 Ruby 元编程确实对更好地理解 Ruby 有很多好处。

看似简单,其实不简单。

说实话,有时候感觉有点 蛋生鸡, 鸡生蛋 的感觉,理解倒是理解了,就是找不到起点。呵呵。

#3 楼 @kevin__liu

我觉得 Class.new 这个应该是我说的那个起点。class 关键字也是变相的调用这个。而且这一部分应该是在 Ruby 解释器初始,就被初始化的。这个的实现方式,应该是完全是调用 C 函数 (具体分配内存呀啥的), 不知道这样理解对不?

#5 楼 @zw963 我也没有深入理解,大家互相学习。我觉得这些东西得尽量理解得深入一点点,对真正懂 Ruby 会有好处。在这里也非常希望有经验的或者正在研究这些的同学们一起来探讨。

嗯,这些问题,我当初看双飞燕 的时候,都想过很久的。

具体怎样,我觉得可以呼一下@skandhas. 让他来解答下。运行一个 Ruby 程序,到底 第一个存在的类 的起点在那里?

#7 楼 @zw963 主席啊~ 你的生物钟颠倒过来了? Ruby 在初始化的时候,就会把 BasicObject,Object,Module,Class 建立起来,并设置好他们的关系,然后就会再进行 Ruby 核心库的初始化。

#8 楼 @skandhas

看这个后,明白多了。

ruby 元编程书中有详细阐述,这知识也是比较有意思的地方

需要 登录 后方可回复, 如果你还没有账号请 注册新账号