在没有引用"instance"的情况下调用Ruby Singleton的方法 [英] Calling a method of a Ruby Singleton without the reference of 'instance'

查看:90
本文介绍了在没有引用"instance"的情况下调用Ruby Singleton的方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在不引用其实例的情况下调用Singleton Object的方法

I would like to call a method of a Singleton Object without the reference to its instance

SingletonKlass.my_method

代替

SingletonKlass.instance.my_method

我想出了这个解决方案(在类中使用method_missing):

i've came up with this solution (using method_missing in the class):

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

这有什么缺点吗? 有没有更好的解决方案? 您有什么建议吗?

is there any drawback to this ? is there any better solution ? any recommendation from you ?

谢谢.

更新:

我的目标是让一个模块与单例类混合使用:

my aim is to have a module to be mixed-in with singleton classes:

module NoInstanceSingleton
   def method_missing(method, *args)
      self.instance.send(method, *args)
   end
end

end然后在类中使用它:

end then use it in the class:

class SingletonKlass
   include Singleton
   extend NoInstanceSingleton

  def method1; end
  def method2; end
  ...
  def methodN; end
end

我希望能够直接致电:

SingletonKlass.method1

推荐答案

使用可转发和def_delegators:

Using forwardable and 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

编辑:如果要包括自己定义的所有方法,可以这样做

If you want to include all the methods you've defined yourself, you could do

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

这篇关于在没有引用"instance"的情况下调用Ruby Singleton的方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆