2

我喜欢 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

更新

红宝石 1.8.7

4

2 回答 2

3

只需将类与实例分开:

class Foo
  def initialize 
  end

  def get_bar
  end

  def get_nar
  end
end

MyFoo = Foo.new
MyFoo.get_bar
于 2012-09-06T13:24:29.350 回答
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:覆盖respond_to?而不是respond_to_missing?

于 2012-09-06T15:43:09.927 回答