Ruby 请教:Module 内一个方法定义的问题

andor_chen · 2012年04月23日 · 最后由 andor_chen 回复于 2012年04月23日 · 2548 次阅读

遇到一个问题没弄明白,向达人请教一下,代码如下:

Module M
  class << self
    def test
      puts "Which?"
    end
  end
end

这里定义的 test 方法是属于哪个对象呢?或者怎样调用这个方法呢?

以上,感谢

属于 M 这个对象 (module 和 class 本身都是对象)。

调用方法:

M::test

or

M.test

#1 楼 @ashchan 这么做就是为了可以不用把 Module include 到类中,可以直接使用 M.test

#1 楼 @ashchan 应该说属于 M 这个对象的 eigenclass 方法永远是属于类的,只有实例变量属于对象

#2 楼 @andor_chen 可用的场景很多。可能也是由于 Ruby 提供了太多定义“类”方法的途径。

#3 楼 @edokeh 在 Ruby 中,类与对象是没有任何区别的。

#4 楼 @ashchan 没错,但是 test 方法确实不属于 M 这个对象

#5 楼 @edokeh 我说没有区别是对第二句来说的。楼主既然问这个问题,他可能对 eigenclass(这个东东本身就有太多种叫法了)还不是太了解。

至于第一句,我们对“属于”的理解可能不大一样:)

我的理解是,在 methods chain 中能找到(亦即 obj.respond_to? :method 为 true),就认为该方法属于该对象。

这个等同于这样:

module M
  def self.test
    puts "Which?"
  end
end


或者这样:

class M
  def self.test
    puts "Which?"
  end
end


不同的是,module 的可以用来 include

我的理解: 没有属于不属于的问题,你为 M 定义了一个单例方法,这个方法定义在 M 的 eigenclass 中。 可以通过

c = class << M
  self
end




只有 M 可以响应这个方法,因为 c 是个单例类,test 是 c 的 instance method

to all:

感谢各位的回复,看样子还得继续看书,好好理解一下

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