gpt4 book ai didi

ruby - def myobject.mymeth 和 class << myobject; 之间的区别迷幻药

转载 作者:太空宇宙 更新时间:2023-11-03 16:07:31 28 4
gpt4 key购买 nike

我目前正在练习/学习 Ruby 中的单例方法和单例类,我遇到了一个疑问。鉴于:

myobject = Object.new

这样做有什么区别吗:

def myobject.mymethod
end

然后这样做:

class << myobject
def mymethod
end
end

如果有,我们什么时候使用其中之一?有什么影响?

最佳答案

使用ruby --dump ins研究结果,如下:

1.

# test.rb
myobject = Object.new

def myobject.mymethod
end

执行 ruby --dump ins 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:mymethod@test.rb>===============
0000 trace 8 ( 3)
0002 putnil
0003 trace 16 ( 4)
0005 leave

2.

# test.rb
myobject = Object.new

class << myobject
def mymethod
end
end

执行 ruby --dump ins 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:singletonclass@test.rb>=========
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:mymethod@test.rb>===============
0000 trace 8 ( 4)
0002 putnil
0003 trace 16 ( 5)
0005 leave

所以 def myobject.method 方法是首先发送 core#define_singleton_method 消息到 myobject ,然后,core#define_singleton_method 消息的实现获取 myobject 的单例类,并将方法定义添加到单例类。

class << myobject 方式是先发送singletonclass消息给myobject,然后发送core#define_method消息给myobject的singletonclass。

在实践中,

如果你想为 obj 定义一些单例方法,使用 class << obj

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

关于ruby - def myobject.mymeth 和 class << myobject; 之间的区别迷幻药,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10344253/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com