首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >继承、self.inherited和instance_methods()

继承、self.inherited和instance_methods()
EN

Stack Overflow用户
提问于 2014-04-02 23:46:00
回答 1查看 727关注 0票数 2

我正在开发rails应用程序(3.2.11),并且正在使用Ruby库的单例实现服务。我尽量避免每次需要时都调用:instance方法(SomethingService.instance.get(some_id)),这样解决我的问题

代码语言:javascript
复制
class SomethingService
    include Singleton
    class << self
        extend Forwardable
        def_delegators :instance, *ShoppingListService.instance_methods(false)
    end
end

所以这个解决方案工作得很好,但是我有很多服务,我不想把这些代码添加到我所有的类中!相反,我试图放入一个超类,如下所示:

代码语言:javascript
复制
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错误...有什么想法吗,伙计们?

EN

回答 1

Stack Overflow用户

发布于 2014-04-03 00:14:02

在这里使用method_missing可能是更好的主意。def_delegators在计算类时执行,甚至可能在定义方法之前执行,因为您是从基类继承的。

您可以尝试类似这样的操作,它将任何未定义的消息转发到实例:

代码语言:javascript
复制
class ServiceBase
  class << self
    def method_missing(name, *args, &block)
      instance.send(name, *args, &block)
    end
  end
end

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

最后一点/问题-你能详细说明一下你从Singleton类中得到了什么好处吗?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22816611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档