Ruby,继承,self.inherited和instance_methods()。 (注:这是一个提问标题,无需回答)

3

我正在开发一个基于Rails(3.2.11版本)的应用程序,我使用了Ruby Library来实现单例模式的服务。我尝试着避免在每次需要使用它时都调用instance方法(如SomethingService.instance.get(some_id)),并通过以下方式解决了这个问题。

class SomethingService
    include Singleton
    class << self
        extend Forwardable
        def_delegators :instance, *ShoppingListService.instance_methods(false)
    end
end

这个解决方案之前一直运行得很好,但是我有很多服务,我不想在所有类中都添加这段代码!相反,我试图将它放在一个超级类中,像这样:

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

不过这让我遇到了一个 堆栈溢出 错误,大佬们有什么想法吗?

1个回答

2

在这里使用method_missing可能是一个更好的主意。当类被评估时,def_delegators会执行,可能会在您的方法甚至定义之前发生,因为您正在从基类继承。

相反,您可以尝试使用以下代码,它将任何未定义的消息转发到实例:

class ServiceBase
  class << self
    def method_missing(name, *args, &block)
      instance.send(name, *args, &block)
    end
  end
end

与委托相比,这种方法可能看起来有些零散。您可以先检查实例方法是否存在,但我认为这并不必要-您只是将未定义的方法处理转移到了实例而不是类。

最后一个观点/问题-您能详细说明首先使用单例类的好处吗?


1
好的。谢谢你,Zach。我试图避免使用:method_missing方法,因为它很难调试。我想使用单例对象,因为类中的一些引用是使用服务器初始化时的某种依赖注入设置的,我希望为每个服务处理一个简单的对象。 - dvxam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接