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

C.new.aaa
# => "aaa"

モジュール Kernel からメソッド print が機能するようになりました

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

これは、このメソッドがクラス メソッドとして定義されていることを意味します。

カーネルにはインスタンス メソッド print がありません

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

最初の質問は、そのクラス メソッドがオブジェクト レシーバーから呼び出されるのはどうしてでしょうか? (C.new)


また、私は自分のモジュールで同じトリックを試みました:

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]

Kernel で定義されているメソッド。インスタンスメソッドとしてのみオーバーライドできます

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 に答える