我想在不引用其实例的情况下调用单例对象的方法
SingletonKlass.my_method
代替
SingletonKlass.instance.my_method
我想出了这个解决方案(在类里面使用 method_missing):
require 'singleton'
class SingletonKlass
include Singleton
def self.method_missing(method, *args, &block)
self.instance.send(method, *args)
end
def my_method
puts "hi there!!"
end
end
这有什么缺点吗? 有没有更好的解决方案? 你有什么建议吗?
谢谢。
更新:
我的目标是让一个模块与单例类混合:
module NoInstanceSingleton
def method_missing(method, *args)
self.instance.send(method, *args)
end
end
结束然后在类里面使用它:
class SingletonKlass
include Singleton
extend NoInstanceSingleton
def method1; end
def method2; end
...
def methodN; end
end
我希望能够直接调用:
SingletonKlass.method1
最佳答案
使用 forwardable 和 def_delegators:
require 'singleton'
require 'forwardable'
class SingletonKlass
include Singleton
class << self
extend Forwardable
def_delegators :instance, :my_method
end
def my_method
puts "hi there!!"
end
end
SingletonKlass.my_method
编辑:如果您想包含您自己定义的所有方法,您可以这样做
require 'singleton'
require 'forwardable'
class SingletonKlass
include Singleton
def my_method
puts "hi there!!"
end
class << self
extend Forwardable
def_delegators :instance, *SingletonKlass.instance_methods(false)
end
end
SingletonKlass.my_method
关于ruby - 在没有 'instance' 引用的情况下调用 Ruby Singleton 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5193942/