Ruby Singleton避免使用实例成员

时间:2012-09-06 11:58:48

标签: ruby

我喜欢Ruby的单身人士,但我想更好地利用它,所以这里是示例

require 'singleton'

class Foo
  include Singleton

  def initialize
    # code to setup singleton here 
  end

  def self.get_bar
    Foo.instance.get_bar
  end

  def get_bar
  end

  def get_nar
  end
end

用法

Foo.instance.get_bar(默认)或Foo.get_bar(由于我制作的静态self.get_bar方法)

有没有优雅的方法可以让所有方法都可以访问,而不必为每个方法编写静态包装器?为每个方法.instance

写作似乎多余

更新

Ruby 1.8.7

2 个答案:

答案 0 :(得分:3)

只需将类与实例分开:

class Foo
  def initialize 
  end

  def get_bar
  end

  def get_nar
  end
end

MyFoo = Foo.new
MyFoo.get_bar

答案 1 :(得分:3)

你可以混合这个模块:

module DelegateToSingleton

  def respond_to_missing?(method)
    super || instance.respond_to?(method)
  end

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

end

进入你的单身人士:

class Foo

  extend DelegateToSingleton
  include Singleton

  def foo
    'foo'
  end

  def bar
    'bar'
  end

end

这些结果:

p Foo.foo    # => "foo"
p Foo.bar    # => "bar"

DelegateToSingleton::method_missing是它的工作原理:每当Foo收到一个它不知道的方法时,它就会将它转发给它的实例。

DelegateToSingleton::respond_to_missing?并不是严格需要的,但是每当使用method_missing玩弄技巧时都会有礼貌。

对于早于1.9.2的Ruby:Override respond_to? instead of respond_to_missing?