【发布时间】:2011-02-11 09:45:11
【问题描述】:
我刚开始玩 JRuby。这是我的第一篇红宝石帖子。我很难理解 Ruby 中的类和对象。这并不意味着像其他面向对象语言中的类和对象。举个例子
Class.is_a? Object
返回真 和
Object.is_a? Object
太。
所以类和对象都是对象
又来了一个
Class.is_a? Class
返回真 和
Object.is_a? Class
太。
等等,我还没写完
Object.instance_of? Class
Class.instance_of? Class
两个都是真的
Object.instance_of? Object
Class.instance_of? Object
两者都是错误的。对,没有什么可以是对象的实例。
还有
Class.kind_of? Class
Object.kind_of? Class
两个都是真的
Class.kind_of? Object
Object.kind_of? Object
两个都是真的
所以两者完全一样,那为什么我们同时拥有这两个呢?
经过一番挖掘,我写了这个简单的方法来返回两者都支持的方法列表
irb(main):054:0> def print_methods(obj)
irb(main):055:1> obj.methods.each do |mm|
irb(main):056:2* puts mm
irb(main):057:2> end
irb(main):058:1> end
print_methods(Object) 和 print_methods(Class) 的唯一区别是
Nesting
如果Nesting是继承的意思,Object是不是类似于密封类??
有人能帮我解释一下这是什么吗?
更新:致 Edds 评论
有趣的是,我在方法列表中看到了很多差异
c=Class.new
print_methods(c)
&
o=Object.new
print_methods(o)
现在我明白一个类的实例实际上是一个类实例(并且这个类实例实际上是一个对象)而不是一个对象实例。甚至这个实例也允许我跨越另一个实例
xx = c.new //works - c is an Object / and xx is a instance of an Object c
yy = o.new //nope - o is already a instance of an Object, so it cannot be instantiated again
所以最后,Object 是一个 Class 的实例。因为
xx.is_a? Class
是假的,但是
xx.is_a? Object
返回真
我说的对吗??
【问题讨论】:
-
+1:良好的演绎技巧
-
我可以衷心推荐这个话题的镐处理:ruby-doc.org/docs/ProgrammingRuby/html/classes.html
-
@Edd,谢谢伙计..会检查.. :)
-
还值得注意的是,到目前为止,您的挖掘已经查看了 Object 和 Class 的类方法,它们相似,但在实例方法上没有。 Class 的实例有一堆 Object 的实例没有的方法。如果您遇到简洁的解释,听到它会很有趣!
-
@Edd,我已经更新了我的帖子,请查看..