Ruby,继承,self.inherited和instance_methods()

时间:2014-04-02 15:46:00

标签: ruby-on-rails ruby

我正在使用rails app(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

但是这给了我一个stack level too deep错误......任何想法的人?

1 个答案:

答案 0 :(得分:1)

在这里使用method_missing可能更好。 def_delegators在评估类时执行,并且可能在您的方法被定义之前发生,只是因为您从该基类继承。

您可以尝试这样的事情,将任何未定义的消息转发到实例上:

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

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

最后一点/问题 - 您能否详细说明您从Singleton课程中获得的好处?