-1
class C
  def aaa
     print "aaa"
  end
end

C.new.aaa
# => "aaa"

现在从模块内核工作方法打印

Kernel.methods.grep /^print/
# => [:printf, :print]

这意味着,该方法定义为类方法。

内核没有实例方法打印

Kernel.instance_methods.grep /^print/
# => []

所以第一个问题是:怎么会从对象接收者调用类方法?(C.新)


我也尝试用自己的模块做同样的把戏:

module M
  def self.print
    "111"
  end
end

class C
include M
  def aaa
     print 
  end
end

C.new.aaa
# => nil

你看,又是内核模块

但层次树是:

C.ancestors
# => [C, M, Object, Kernel, BasicObject]

M.methods.grep /^print/
# => [:print]

方法在内核中定义。我只能作为实例方法覆盖

module M
  def print
    "111"
  end
end


M.instance_methods.grep /^print/
# => [:print]

那么内核如何做到这一点?内核如何将类方法作为实例方法?

4

1 回答 1

3
1.9.3-p327 :002 > Kernel.private_instance_methods.grep /^print/
=> [:printf, :print]

instance_methods只给你一个公共实例方法的列表。由于Kernel被包含Object,它的私有实例方法总是可用的,所以没有必要将它们公开。

于 2012-12-22T19:59:29.210 回答