gpt4 book ai didi

Ruby:Open Module 的单例

转载 作者:数据小太阳 更新时间:2023-10-29 08:38:21 25 4
gpt4 key购买 nike

因此在 Ruby 类中,您可以使用像 class << self 这样的成语。像下面这样:

class SalesOrganization
def self.find_new_leads
...
end
class << self
include ::NewRelic::Agent::Instrumentation::ControllerInstrumentation
add_transaction_tracer :find_new_leads, :category => :task
end
end

我的问题是如果SalesOrganization怎么办?实际上是一个 Module而不是 Class .这是在做我希望它会做的事情,还是我开启了一些我不应该涉足的黑魔法?

# Potentially terrible code
module SalesOrganization
def self.find_new_leads
...
end
class << self
include ::NewRelic::Agent::Instrumentation::ControllerInstrumentation
add_transaction_tracer :find_new_leads, :category => :task
end
end

如何访问模块单例类?

最佳答案

不,你没有释放任何黑魔法。您可以在任何对象上定义单例方法,包括模块(Module 类的实例):

module M; end

def M.a
"a"
end

M.a # => "a"

您建议的方法也有效:

module M
def self.b
"b"
end
end

M.b # => "b"

module M
class << self
def c
"c"
end
end
end

M.c # => "c"

如果您的方法定义直到运行时才知道,您也可以使用 instance_eval:

module M; end

M.instance_eval <<EOF
def d
"d"
end
EOF

M.d # => "d"

当然,像 NewRelic... 这样的模块可能会对包含它们的类/模块做出假设,所以你必须小心。

关于Ruby:Open Module 的单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20713537/

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