我正在开发 Rails 应用程序 (3.2.11),并且我正在使用 Ruby 库的服务实现单例服务。我试图避免在每次需要时调用 :instance 方法 (SomethingService.instance.get(some_id)
),这样解决了我的问题
class SomethingService
include Singleton
class << self
extend Forwardable
def_delegators :instance, *ShoppingListService.instance_methods(false)
end
end
所以这个解决方案工作得很好,但我有很多服务,我不想把这个代码添加到我所有的类中!相反,我试图加入这样的父类(super class):
class ServiceBase
include Singleton
def self.inherited(subclass)
super(subclass) # needed because inherited is override by Singleton
class << subclass
extend Forwardable
def_delegators :instance, *self.instance_methods(false)
end
end
end
但是这给我一个stack level too deep
错误...有什么想法吗?
最佳答案
在这里使用 method_missing
可能是个更好的主意。 def_delegators
在评估类时执行,甚至可能在您的方法定义之前发生,这仅仅是因为您是从该基类继承的。
您可以改为尝试类似的方法,它将任何未定义的消息转发到实例:
class ServiceBase
class << self
def method_missing(name, *args, &block)
instance.send(name, *args, &block)
end
end
end
与委派相比,它可能看起来有点漫不经心。您可以先检查实例方法是否存在,但我认为这不是必需的 - 您只是将未定义的方法处理转移到实例而不是类。
最后一个要点/问题 - 您能详细说明一下您从 Singleton 类中得到了什么好处吗?
关于ruby-on-rails - Ruby、继承、self.inherited 和 instance_methods(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22816611/