新手问题 Object class 求教

youseke · 2013年06月04日 · 最后由 wppurking 回复于 2013年06月05日 · 2284 次阅读

碰到下面的情况

1.9.3p194 :001 > class Object
1.9.3p194 :002?>   def foo
1.9.3p194 :003?>     puts 'foo'
1.9.3p194 :004?>     end
1.9.3p194 :005?>   end
 => nil
1.9.3p194 :006 > Object.foo
foo
 => nil
1.9.3p194 :007 > Object.new.foo
foo
 => nil

请问为什么会这样…foo 不是作为 Object class 的 instance method 被定义的吗,为什么 Object 也可以调用了… 多谢 (之前不够清晰,修正了一下…)

Object 这个对象是 Class 的实例,而 Class 的超类 (Class.ancestors) 中包含 Object 类。

看了一下,果真是这样…多谢了,自己还是记不牢啊…

Object is the default root of all Ruby objects. 所以你在 Object 类中加入一个新的方法就想当于为所有的对象添加了这个方法。

#3 楼 @edgar_wang_cn 多谢回复,你说的很对,具体的实现方法应该就是#1 楼 @5long 所说的那样把

嗯,这个例子很好的说明了 class is an object, object is a class.

class Object
  def self.foo
    puts 'self.foo'
  end

  def foo
    puts 'foo'
  end
end

Object.foo # self.foo
Object.new.foo # foo

String.foo # self.foo
String.new.foo # foo

虽然都是 foo 方法,而 Ruby 在 method lookup 时上,找到方法的位置不一样。

还有就是你打开的 Object 是个老祖宗,Ruby 中所有对象都有一个 class, 而这个 class 在 ruby 中也是一个对象,所以也就是一个 Object 实例。

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