ruby 疯狂 : Class vs Object?

标签 ruby class object

我刚开始玩 JRuby。这是我的第一篇 ruby 帖子。我很难理解 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

所以最后,对象实际上是一个类的实例。因为

  xx.is_a? Class 

是假的,但是

  xx.is_a? Object 

返回真值

我说得对吗??

最佳答案

基本上要理解的关键是每个类都是 Class 的一个实例类,每个类都是 Object 的子类(在 1.8 - 1.9 中,每个类都是 BasicObject 的子类)。所以每个类都是对象,因为它是 Object 的子类的实例。 ,即 Class .

当然这意味着Class是它自己的一个实例。如果这让你的大脑受伤,那就别想得太深了。

ObjectClassis_a? Object

x.is_a? y返回 true如果x.class == y or x.class < y ,即如果 x的类(class)是yx的类继承自 y .由于每个类都继承自对象 x.is_a? Object无论如何返回真x是。 (无论如何在 1.8 中,在 1.9 中还有 BasicObject,它现在是继承层次结构中最基本的类)。

它们也是is_a? Class

两者都是 ObjectClass确实是类,所以这不足为奇。

它们也是instance_of? Class , 但不是 instance_of? Object .

不同于is_a? , x.instance_of? y仅在 x.class == y 时返回真,而不是如果 x.classy 的子类.所以既然xyinstance_of? Class , 他们不是 instance_of? Object .

right, nothing can be instance of object.

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

kind_of?

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

So both are exactly same, then why do we have both these.?

应该指出的是,到目前为止,所有类都是如此。例如。 String.is_a? Object , String.is_a? ClassString.instance_of? Class是真实的并且String.instance_of? Object出于与上述相同的原因是错误的。 (由于同样的原因,String.is_a? StringString.instance_of? String 都是假的——字符串是一个类,而不是一个字符串)。

您不能由此得出所有类都相同的结论。它们只是同一类的所有实例。

比较方法

因为两个ObjectClass是类,它们都具有 Class 定义的所有实例方法. Class另外还有单例方法 nesting . nesting告诉你当前嵌套在哪个模块中,它与继承无关。

对于任何给定的类 TheClass.methods将返回 Class 定义的实例方法(例如 superclass 返回 TheClass 继承自的类,new 创建 TheClass 的新实例)加上该类定义的单例方法。

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

关于 ruby 疯狂 : Class vs Object?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4967556/

相关文章:

java - 集成不同部分的代码

python - 为什么我不能在一个类中连接 'str' 和 'instance' 对象?

object - 在 Kotlin 中返回不同类型的对象

javascript - 为什么带有对象的 typeof 数组返回 "object"而不是 "array"?

Java 对象数组

ruby-on-rails - rvm gem 安装错误?

ruby - 在 Ruby 中关闭 SSL 证书验证

ruby - compass 路径需要更正

c++ - 带有模板的字符串堆栈?

Java:为类的所有实例设置 boolean 值