因此,在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
实际上是aModule
而不是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...
可能会对它们所包含的类/模块做出假设,因此您必须在此处格外小心。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句