class Object
def do_it
puts "do it"
end
end
Object.do_it #这个class method 怎么来的?
Object.new.do_it
大神给解答下 Object.do_it 怎么来的?
是对象没有问题,不过这个对象是没有分配内存地址的,从逻辑上说是 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
=> []
这感觉是个好问题,我来详细说说吧,不一定对。
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?