ruby - 在没有 'instance' 引用的情况下调用 Ruby Singleton 的方法

标签 ruby singleton metaprogramming

我想在不引用其实例的情况下调用单例对象的方法

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/

相关文章:

c++ - 通过惰性求值使 Meyers 的 Singleton 线程安全快速

java - 如何从我在运行时使用 ASM 动态创建的 Java 类中获取和使用类类型?

Ruby:如何只允许将某种对象添加到集合中

ruby-on-rails - Rails 教程第 1 章10 测试10.20失败

java - 通过某些组件名称模式将组件/类加载到 ArrayList 中

r - 在 R 中,如何使用 quote 或 bquote 引用注释?

c++:是否有类似 "boost/std typetraits conditional"的东西在编译时生成一个值(不是类型)?

ruby-on-rails - 如何在 Rails 中创建可逆迁移助手?

ruby-on-rails - AWS Rekognition 文本检测

F#:模块 let 和类型 static let 之间有什么区别?