2012-04-27 94 views
2

我目前在Ruby中练习/学习单例方法和单例类,而且我也遇到过一些疑问。鉴于:def myobject.mymeth和class << myobject; def mymeth

myobject = Object.new 

是否有这样做有什么区别:

def myobject.mymethod 
end 

,做这样的:

class << myobject 
def mymethod 
end 
end 

如果有,我们会用一个或其他?什么影响?

回答

2

使用红宝石自卸插件研究结果如下:

1.

# test.rb 
myobject = Object.new 

def myobject.mymethod 
end 

执行红宝石自卸插件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的单例类,并添加方法d定义为 单例类。

类< < MyObject来的方法是首先发送singletonclass消息给MyObject来,然后,派核心#define_method消息到MyObject来的singletonclass。

在实践中,

如果要定义一些的OBJ单方法,使用类< < OBJ

如果您只为obj定义单例方法,请使用def obj.method

相关问题