我刚开始玩JRuby.这是我的第一篇ruby帖子.我很难理解Ruby中的类和对象.这并不意味着什么课程&其他面向对象语言中的对象.例如

Class.is_a? Object

返回true

Object.is_a? Object

too

因此,阶级与社会;对象都是对象

又来了一个

Class.is_a? Class

返回true

Object.is_a? Class

too

等等,我还没说完

 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_方法(对象)和print_方法(类)之间唯一的方法区别是

     Nesting

如果嵌套意味着继承,那么对象是否与密封类相似??

有人能告诉我这是什么吗?

Update:至Edds comments

有趣的是,我在中的方法列表中看到了很多差异

c=Class.new
print_methods(c)

&

o=Object.new
print_methods(o)

Now I understand Instance of a class is really an class instance (和 this class instance is actually a Object) not an object instance. 和 even this instance allow me to span another instances

  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 

返回true

我说得对吗??

推荐答案

基本上,需要理解的关键是,每个类都是Class类的实例,每个类都是Object的子类(在1.8-1.9中,每个类都是BasicObject的子类).所以每个类都是一个对象,从某种意义上说,它是Object的一个子类的一个实例,即Class.

当然,这意味着Class本身就是一个例子.如果这会让你的大脑受伤,那就不要想得太深.

Object and Class are is_a? Object

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

They are also is_a? Class

ObjectClass实际上都是班级,所以这并不奇怪.

They are also instance_of? Class, but not instance_of? Object.

is_a?不同,x.instance_of? y仅在x.class == y时返回true,而在x.classy的子类时不返回true.因为xy都是instance_of? Class,所以它们不是instance_of? Object.

对,任何东西都不能是对象的实例.

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

有点?

有点?is_a?的别名,请参见上文.

所以两者都是完全相同的,那么我们为什么要有这两个呢.?

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

你不能由此得出结论,所有的课程都是一样的.它们只是同一类的所有实例.

比较方法

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

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

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

Ruby相关问答推荐

Ruby:对于不存在的键,使用缺省值Hash在Hash中存储Hash

如何使用Ruby中的时区函数S标准库?

如何用 yield_self 断链

Ruby符号前面的-是什么意思?

使用 RSpec 存根 Time.now

什么是 Sinatra/Rack 的非常简单的身份验证方案

出于调试目的,如何打印有关 NET:HTTPRequest 的信息?

如何从最后一个元素开始遍历数组?

Ruby 中的 -> (stab) 运算符是什么?

用元素填充数组 N 次

如何在 RSpec 2 中自动加载 spec_helper.rb

从 Ruby 中的 URL 获取文件名的好方法是什么?

如何测试数组中的所有项目是否相同?

对哈希中数组的值求和

了解 Ruby 的加载路径

在 Ruby 中打开默认浏览器

我安装了一个 gem,但 require 'gemname' 不起作用.为什么?

未加载库:/opt/local/lib/libssl.1.0.0.dylib (LoadError)

为依赖于环境变量的代码编写规范的最佳方法是什么?

如何在 Ruby 中创建整数循环?