6

我正在尝试在 ruby​​ 中初始化一个单例。这是一些代码:

class MyClass
  attr_accessor :var_i_want_to_init

  # singleton
  @@instance = MyClass.new
  def self.instance
    @@instance
  end

  def initialize # tried 1. initialize, 2. new, 3. self.initialize, 4. self.new
    puts "I'm being initialized!"
    @var_i_want_to_init = 2
  end
end

问题是初始化从未被调用,因此单例从未被初始化。我尝试将init方法命名为initialize、self.initialize、new和self.new。没有任何效果。“我正在初始化”从未打印过,并且在我实例化时变量从未初始化

my_var = MyClass.instance

如何设置单例以使其初始化?帮助表示赞赏,

帕春

4

2 回答 2

18

有一个用于单例的标准库

require 'singleton'

class MyClass
  include Singleton
end

要修复您的代码,您可以使用以下内容:

class MyClass
  attr_accessor :var_i_want_to_init

  def self.instance
    @@instance ||= new
  end

  def initialize # tried 1. initialize, 2. new, 3. self.initialize, 4. self.new
    puts "I'm being initialized!"
    @var_i_want_to_init = 2
  end
end
于 2012-05-24T08:28:49.133 回答
5

Rubymotion (1.24+) 现在似乎支持使用 GCD 创建单例

class MyClass
  def self.instance
    Dispatch.once { @instance ||= new }
    @instance
  end
end
于 2012-11-27T21:53:59.647 回答