确保类的单个实例的正确方法是什么?

Luk*_*ick 3 ruby singleton coding-style

在java中,我会创建这样的东西:

private static MyClass instance;

public static MyClass getInstance() {
  if(instance != null) {
    return instance;
  }
  instance = new MyClass();
  return instance;
}
Run Code Online (Sandbox Code Playgroud)

在 ruby​​ 中获得相同功能的合适方法是什么?

更新:我已经阅读了关于“包含单例”的内容,但是当我尝试在 Ruby 1.9 上的 irb 中执行此操作时,我得到了:

[vertis@raven:~/workspace/test]$ ruby -v
ruby 1.9.1p378 (2010-01-10 revision 26273) [i386-darwin9.4.0]
[vertis@raven:~/workspace/test]$ irb
irb(main):001:0> class TestTest
irb(main):002:1>   include Singleton
irb(main):003:1> end
NameError: uninitialized constant TestTest::Singleton
    from (irb):2:in `<class:TestTest>'
    from (irb):1
    from /usr/local/bin/irb:12:in `<main>'
Run Code Online (Sandbox Code Playgroud)

Vit*_*ner 5

已经有关于如何在 Ruby 中执行此操作的答案,但我首先要问您是否需要这样做?

无需将您的 Java 模式复制到 Ruby。我从 2005 年开始使用 Ruby,从来不需要单例类。

为什么你需要一个实例?为什么不能只定义类方法并在类上调用它们。

据我了解,您正在尝试以下方法:

instance = Klass.new
instance.foo
.. then somewhere else
instance = Klass.new # expecting this to return the same instance
instance.bar
Run Code Online (Sandbox Code Playgroud)

但是你可以这样做:

Klass.foo
... in other place
Klass.bar
Run Code Online (Sandbox Code Playgroud)

而且由于只有一类 Klass,您的问题本机就解决了,而且输入的内容也更少:)

Ruby 中的类只是类 Class 的实例,因此它们可以拥有实例可以拥有的一切。