6

ルビーでシングルトンを初期化しようとしています。ここにいくつかのコードがあります:

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 に答える