Ruby Object 定义的方法求解答

secondrocker · 2014年12月19日 · 最后由 chill 回复于 2014年12月27日 · 2358 次阅读
class Object
  def do_it
    puts "do it"
  end
end

Object.do_it #这个class method 怎么来的?
Object.new.do_it

大神给解答下 Object.do_it 怎么来的?

Object 本身也是一个对象。

Object.class # => Class
Class.superclass.superclass # => Object
3 楼 已删除

#1 楼 @zgm 那就是 Object 也是 Object 的对象,就像 Class 是 Class 的对象一样?

#2 楼 @erithair 那就是 Object 也是 Object 的对象,就像 Class 是 Class 得对象一样?

#2 楼 @erithair 明白了,Object 是他自己子类的对象,所以可以调用实例方法,对吧?

是对象没有问题,不过这个对象是没有分配内存地址的,从逻辑上说是 Object.new.class 是 Object。 但是 Object.new 会分配内存地址。BTW。do_it 不是 class_method,只是一个 instance method。

[1] pry(main)> Object.new
=> #<Object:0x007fe87f4cf580>
[2] pry(main)> Object.new.class
=> Object
[3] pry(main)> Object
=> Object

In Addtion:

[1] pry(main)> class Object
[1] pry(main)*   def do_it
[1] pry(main)*     puts "do_it"
[1] pry(main)*   end
[1] pry(main)* end
=> :do_it
[2] pry(main)> Object.instance_methods(false)
=> [:pry, :__binding__, :do_it]
[3] pry(main)> Object.singleton_methods
=> []
8 楼 已删除

这感觉是个好问题,我来详细说说吧,不一定对。

1.Object 中定义的是实例方法 do_it。

2.Object 是 Class 的父类,于是 Class 继承 Object 的实例方法 do_it。

3.所有类的类方法都保存在在 C 语言层次中的元类中,即 Object 有一个元类 (Object) 保存了 Object 的类方法。

4.Object 的元类 (Object) 继承的是 Class。于是 (Object) 中也有了 Class 的实例方法。

然后 Object 中定义的 do_it 就莫名其妙可以同时作为实例方法和类方法运行了。

具体请看这个关系图。

这感觉是个好问题,我来详细说说吧,不一定对。

1.Object 中定义的是实例方法 do_it。

2.Object 是 Class 的父类,于是 Class 继承 Object 的实例方法 do_it。

3.所有类的类方法都保存在在 C 语言层次中的元类中,即 Object 有一个元类 (Object) 保存了 Object 的类方法。

4.Object 的元类 (Object) 继承的是 Class。于是 (Object) 中也有了 Class 的实例方法。

然后 Object 中定义的 do_it 就莫名其妙可以同时作为实例方法和类方法运行了。

具体请看这个关系图。

是的,上面说的都很清楚了。

x = Object.new
x.do_it #=> 就会去x的类里(也就是Object里)找do_it方法

Object.do_it #=>就会去Object的类里,也就是 Class里找do_it,因为找不到就会去Class的超类也就是Object里找do_it

Object 的类是 Class,Class 的父类是 Object。do_it 从 Object 传递到了 Class,成为类对象的方法。 你加一句 class A; end A.do_it 是不是也显示 do it?

需要 登录 后方可回复, 如果你还没有账号请 注册新账号