2012-04-27 28 views
2

私は現在、Rubyでシングルトンメソッドとシングルトンクラスを練習していますが、私は疑いの余地はありません。考える:私たちはどちらか一方を使用する際に、存在する場合def myobject.mymethとクラス<< myobjectの違い。 def mymeth

class << myobject 
def mymethod 
end 
end 

def myobject.mymethod 
end 

とこれをやって:

myobject = Object.new 

は、これを行うとの間の違いはありますか?何が意味ですか?

答えて

2

使用ルビー--dumpイン次のように、結果を研究する:

1.

# test.rb 
myobject = Object.new 

def myobject.mymethod 
end 

ルビー--dumpインtest.rb

出力を実行:

D:\>ruby --dump ins test.rb 
== disasm: <RubyVM::InstructionSequence:<main>@test.rb>================= 
local table (size: 2, argc: 0 [opts: 0, rest: -1, post: 0, block: -1] s1) 
[ 2] myobject 
0000 trace   1            ( 1) 
0002 getinlinecache 9, <ic:0> 
0005 getconstant  :Object 
0007 setinlinecache <ic:0> 
0009 send    :new, 0, nil, 0, <ic:1> 
0015 setdynamic  myobject, 0 
0018 trace   1            ( 3) 
0020 putspecialobject 1 
0022 getdynamic  myobject, 0 
0025 putobject  :mymethod 
0027 putiseq   mymethod 
0029 send    :"core#define_singleton_method", 3, nil, 0, <ic:2> 
0035 leave 
== disasm: <RubyVM::InstructionSequence:[email protected]>=============== 
0000 trace   8            ( 3) 
0002 putnil 
0003 trace   16            ( 4) 
0005 leave 

2.

# test.rb 
myobject = Object.new 

class << myobject 
def mymethod 
end 
end 

ルビー--dumpインtest.rb

出力が実行されます。

D:\>ruby --dump ins test.rb 
== disasm: <RubyVM::InstructionSequence:<main>@test.rb>================= 
local table (size: 2, argc: 0 [opts: 0, rest: -1, post: 0, block: -1] s1) 
[ 2] myobject 
0000 trace   1            ( 1) 
0002 getinlinecache 9, <ic:0> 
0005 getconstant  :Object 
0007 setinlinecache <ic:0> 
0009 send    :new, 0, nil, 0, <ic:1> 
0015 setdynamic  myobject, 0 
0018 trace   1            ( 3) 
0020 getdynamic  myobject, 0 
0023 putnil 
0024 defineclass  :singletonclass, singletonclass, 1 
0028 leave 
== disasm: <RubyVM::InstructionSequence:[email protected]>========= 
0000 trace   2            ( 3) 
0002 trace   1            ( 4) 
0004 putspecialobject 1 
0006 putspecialobject 2 
0008 putobject  :mymethod 
0010 putiseq   mymethod 
0012 send    :"core#define_method", 3, nil, 0, <ic:0> 
0018 trace   4            ( 6) 
0020 leave               ( 4) 
== disasm: <RubyVM::InstructionSequence:[email protected]>=============== 
0000 trace   8            ( 4) 
0002 putnil 
0003 trace   16            ( 5) 
0005 leave 

のでdefの方法は、第一のコアを送信していることであるをmyobject.method #define_singleton_methodメッセージをmyobjectに送信すると、 コア#define_singleton_methodメッセージの実装では、myobjectのシングルトンクラスが取得され、シングルトンクラス への定義。

クラス< < MyObjectにの方法は、最初にMyObjectにのsingletonclassにコア#1 define_methodメッセージを送って、それから、MyObjectにへsingletonclassメッセージを送ることです。あなたがobjのシングルトンメソッドのいくつかを定義したい場合は実際には

クラス< < OBJを使用しています。

objのシングルトンメソッドのみを定義する場合は、def obj.methodを使用します。

関連する問題