Ruby的疯狂:类与对象?

我刚开始玩JRuby。 这是我的第一个rubypost。 我很难理解Ruby中的类和对象。 它并不意味着像其他面向对象的语言中的类和对象。 举一个例子

Class.is_a? Object 

返回true

 Object.is_a? Object 

也是

所以class&Object都是对象

这里是另一个

 Class.is_a? Class 

返回true

 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 

如果嵌套意味着inheritance,那么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 

返回true

我对吗, ??

基本上,要理解的关键是每个类都是Class类的一个实例,每个类都是Object的子类(在1.8 – 1.9中,每个类都是BasicObject的子类)。 所以每个类都是Object一个实例,也就是Class一个实例。

当然这就意味着Class本身就是一个实例。 如果这会让你的大脑受到伤害,那就不要太深思。

ObjectClassis_a? Object is_a? Object

x.is_a? y 如果x.class == y or x.class < y ,则返回true ,即如果x的类是y或者x的类从yinheritance。 由于每个类都inheritance自对象x.is_a? Object 无论x是什么, x.is_a? Object返回true。 (无论如何,1.9中还有BasicObject ,它现在是inheritance层次结构中最基本的类)。

他们也是is_a? Class is_a? Class

ObjectClass都是类,所以不应该是令人惊讶的。

他们也是instance_of? Class instance_of? Class ,但不是instance_of? Object instance_of? Object

不像is_a?x.instance_of? y 如果x.class == yx.instance_of? y只返回true,如果x.classy的子类,则不返回true。 那么既然xy都是instance_of? Class instance_of? Class ,他们不是instance_of? Object instance_of? Object

对,没有什么可以是对象的实例。

这不是真的。 Object.new.instance_of? Object Object.new.instance_of? Object是真的。

有点?

kind_of?is_a?的别名is_a? ,所以见上面。

所以两者是完全一样的,那为什么我们有这两个呢?

需要指出的是,到目前为止,所有阶级都是如此。 例如String.is_a? Object String.is_a? ObjectString.is_a? Class String.is_a? ClassString.instance_of? Class String.instance_of? Class是true和String.instance_of? Object 由于与上述相同的原因, String.instance_of? Object是错误的。 ( String.is_a? StringString.instance_of? String也是同样的原因 – String是一个类,而不是一个string)。

你不能从这里得出所有的类都是一样的。 他们只是同一class的所有实例。

比较方法

由于ObjectClass都是类,它们都具有由Class定义的所有实例方法。 Class还有单例方法nestingnesting告诉你当前嵌套在哪个模块中,它与inheritance无关。

对于任何给定的类, TheClass.methods将返回由Class定义的实例方法(例如, superclass ,它返回TheClassinheritance的类, new创buildTheClass一个新实例)以及由该类定义的单例方法。

无论如何, methods只告诉你哪些方法可以直接调用给定的对象。 它不会告诉你哪些方法可以在一个类的实例上调用。 为此,您可以使用instance_methods ,这会返回ObjectClass显着不同的结果。

在Ruby中,一切都是包含类和模块的ObjectObject是最低级的类(好吧,在Ruby 1.9.2中也有BasicObject但是这是另外一个故事)。

看到下面的输出。

 > Object.ancestors # => [Object, Kernel, BasicObject] > Class.ancestors # => [Class, Module, Object, Kernel, BasicObject] > Module.ancestors # => [Module, Object, Kernel, BasicObject] > String.ancestors # => [String, Comparable, Object, Kernel, BasicObject] 

正如你所看到的, ClassModule都是从Objectinheritance的。

回到你原来的说法,你必须明白不同之处

  • is_a?
  • kind_of'
  • instance_of?

它们不可互换。 is_a?kind_of? 如果其他是相同的类或祖先,则返回true。 相反, instance_of? 仅在其他类是相同的类时返回true。

 > Class.is_a? Object # => true > Class.kind_of? Object # => true > Class.instance_of? Object # => false 

Ramesh,在ruby中, 一切都是一个对象,一个Class也不例外。

试试这个irb

 ruby-1.9.2-p136 :001 > o = Object.new => #<Object:0x000001020114b0> ruby-1.9.2-p136 :002 > o.is_a? Class => false ruby-1.9.2-p136 :003 > o.is_a? Object => true 

在这种情况下,我创build了一个Object的实例,并检查它是一个类(false)还是一个Object(true)。

Ruby中的类是用于创build该类的实例的某种模板对象。 对不起,这不是很清楚。 关键的概念是ruby是一种纯粹的面向对象的语言,而不是Java。

类/元类的层次结构总是有点令人费解:)只是为了比较, 这里是Smalltalk中的一个 ; 在Ruby中,这个设置基于相同的原则,除了没有BehaviorClassDescription区别外,还有一些模块和特征类需要考虑。

正如本相关问题指出的, Pharo by Example中提供了Smalltalk对象模型的完整解释。

因为_why在这篇文章中写道

对象不存储方法,只有类可以。

第一对夫妇部分有关于类和对象的一些好点

将类视为全局对象。