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
本身就是一个实例。 如果这会让你的大脑受到伤害,那就不要太深思。
Object
和Class
是is_a? Object
is_a? Object
x.is_a? y
如果x.class == y or x.class < y
,则返回true
,即如果x
的类是y
或者x
的类从y
inheritance。 由于每个类都inheritance自对象x.is_a? Object
无论x
是什么, x.is_a? Object
返回true。 (无论如何,1.9中还有BasicObject
,它现在是inheritance层次结构中最基本的类)。
他们也是is_a? Class
is_a? Class
Object
和Class
都是类,所以不应该是令人惊讶的。
他们也是instance_of? Class
instance_of? Class
,但不是instance_of? Object
instance_of? Object
。
不像is_a?
, x.instance_of? y
如果x.class == y
, x.instance_of? y
只返回true,如果x.class
是y
的子类,则不返回true。 那么既然x
和y
都是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? Object
, String.is_a? Class
String.is_a? Class
和String.instance_of? Class
String.instance_of? Class
是true和String.instance_of? Object
由于与上述相同的原因, String.instance_of? Object
是错误的。 ( String.is_a? String
和String.instance_of? String
也是同样的原因 – String是一个类,而不是一个string)。
你不能从这里得出所有的类都是一样的。 他们只是同一class的所有实例。
比较方法
由于Object
和Class
都是类,它们都具有由Class
定义的所有实例方法。 Class
还有单例方法nesting
。 nesting
告诉你当前嵌套在哪个模块中,它与inheritance无关。
对于任何给定的类, TheClass.methods
将返回由Class
定义的实例方法(例如, superclass
,它返回TheClass
inheritance的类, new
创buildTheClass
一个新实例)以及由该类定义的单例方法。
无论如何, methods
只告诉你哪些方法可以直接调用给定的对象。 它不会告诉你哪些方法可以在一个类的实例上调用。 为此,您可以使用instance_methods
,这会返回Object
和Class
显着不同的结果。
在Ruby中,一切都是包含类和模块的Object
。 Object
是最低级的类(好吧,在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]
正如你所看到的, Class
和Module
都是从Object
inheritance的。
回到你原来的说法,你必须明白不同之处
-
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中,这个设置基于相同的原则,除了没有Behavior
和ClassDescription
区别外,还有一些模块和特征类需要考虑。
正如本相关问题指出的, Pharo by Example中提供了Smalltalk对象模型的完整解释。
因为_why在这篇文章中写道
对象不存储方法,只有类可以。
第一对夫妇部分有关于类和对象的一些好点
将类视为全局对象。