私はRubyで最も安全なシングルトンを書くつもりです。私は言語に慣れていないので、弾力性があり、私のシングルトンクラスが1つのインスタンスを作成するのに成功するという強い感覚はありません。ボーナスとして、実際に使用されている場合にのみオブジェクトがインスタンス化されるようにしたいと思います。Rubyでシングルトンパターンを作成する正しい方法は何ですか?
25
A
答えて
43
# require singleton lib
require 'singleton'
class AppConfig
# mixin the singleton module
include Singleton
# do the actual app configuration
def load_config(file)
# do your work here
puts "Application configuration file was loaded from file: #{file}"
end
end
conf1 = AppConfig.instance
conf1.load_config "/home/khelll/conf.yml"
#=>Application configuration file was loaded from file: /home/khelll/conf.yml
conf2 = AppConfig.instance
puts conf1 == conf2
#=>true
# notice the following 2 lines won’t work
AppConfig.new rescue(puts $!)
#=> new method is private
# dup won’t work
conf1.dup rescue(puts $!)
#=>private method `new’ called for AppConfig:Class
#=>can’t dup instance of singleton AppConfig
シングルトンモジュールをクラスに含めると、ルビは何をしますか?
new
メソッドはプライベートなので、使用できません。- クラスのインスタンスを1つしかインスタンス化しないインスタンスと呼ばれるクラスメソッドを追加します。
だから、ルビーシングルトンモジュールを使用するには、二つのことを必要とする:
- は、所望のクラスの中にそれを含めるのlib
singleton
を必要としています。 instance
メソッドを使用して、必要なインスタンスを取得します。
8
require 'singleton'
class Klass
include Singleton
# ...
end
説明のためRuby Standard LibrarySingleton class documentionを参照してください。
16
シングルトンを作成する場合、クラスを作成するのはなぜですか?オブジェクトを作成し、必要なメソッドとインスタンス変数を追加します。あなたのシングルトンオブジェクトを継承したい場合
>> module OtherSingleton
>> @index = -1
>> @colors = %w{ red green blue }
>> def self.change
>> @colors[(@index += 1) % @colors.size]
>> end
>> end
=> nil
>> OtherSingleton.change
=> "red"
>> OtherSingleton.change
=> "green"
>> OtherSingleton.change
=> "blue"
>> OtherSingleton.change
=> "red"
:人々は、このパターンを実装することを
>> MySingleton = Object.new
=> #<Object:0x100390318>
>> MySingleton.instance_eval do
?> @count = 0
>> def next
>> @count += 1
>> end
>> end
=> nil
>> MySingleton.next
=> 1
>> MySingleton.next
=> 2
>> MySingleton.next
=> 3
より標準的な方法は、(というより一般的なObject
より)シングルトンオブジェクトとしてModule
を使用することですいくつかのクラスは、単にそれをそのクラスのインスタンスにします。 mixinから継承するには、#extend
を使用してください。シングルトンオブジェクトが必要な場合、Rubyは本当に簡単ですし、他の言語とは異なり、クラスで定義する必要はありません。
アドホックシングルトン(私の最初の例)は、すべての場所にあり、私が遭遇した大部分のケースをカバーしています。モジュールのトリックは通常、残りの部分をカバーしています(私はもう少し正式なものが必要なとき)。
Rubyコードでは、明示的にオブジェクトのクラスをチェックするのではなく、ダックの型指定(#respond_to?
経由)を使用する必要があります。したがって、私は通常、自分のクラスの一意性を気にしません。ユニークですが、後に追加したものすべて。
関連する問題
- 1. ジャンゴピストンクライアントを作成する正しい方法は何ですか?
- 2. データアクセスレイヤのメソッドを作成する正しい方法は何ですか?
- 3. アコーディオンウィジェットを作成する意味的に正しい方法は何ですか?
- 4. Rubyからクリップクリップを開く標準/正しい方法は何ですか?
- 5. リポジトリパターンを使用してオブジェクトの新しいインスタンスを作成する正しい方法は何ですか?
- 6. スレッドセーフなシングルトンパターンを実装する最も安全な方法は何ですか?
- 7. Motifでボタンウィジェットの長いスクロールリストを作成する正しい方法は何ですか?
- 8. JSP/Servletで再利用可能で柔軟なフォームコンポーネントを作成する正しい方法は何ですか?
- 9. Pythonのlogging.FileHandlerを構成する正しい方法は何ですか?
- 10. Expressリクエストで返されるエラーメッセージを作成する正しい方法は何ですか?
- 11. php.log:ログファイルをクリアする正しい方法は何ですか?
- 12. PushSharpを使用する正しい方法は何ですか?
- 13. System.Threading.Tasks.Taskを終了する正しい方法は何ですか?
- 14. MediaControllerを切断する正しい方法は何ですか?
- 15. basic4androidをインストールする正しい方法は何ですか?
- 16. Rubyでのシングルトンパターンの実装
- 17. ext4デザイナでリモート設定可能なグリッドを作成する正しい方法は何ですか?
- 18. erlang mongodbドライバを使用してdbアクションを作成する正しい方法は何ですか?
- 19. Zurb Foundationを使用して大きな入力テキストを作成する正しい方法は何ですか
- 20. Rubyで属性のエイリアスを作成する最も良い方法は何ですか?
- 21. Qtヘッダーを含める正しい方法は何ですか?
- 22. Juliaでモジュールファイナライズメソッドを書く正しい方法は何ですか?
- 23. herokuでmongodbを使う正しい方法は何ですか
- 24. jQueryプラグインを作成する私の方法は正しいですか?
- 25. リダイレクトする正しい方法は何ですか?
- 26. Rails 3 - ネストされた属性を持つリソースを作成する正しい方法は何ですか?
- 27. RestKit 0.20 - 新しいNSManagedObjectを作成する方法は何ですか?
- 28. GUIを作成する適切な方法は何ですか
- 29. DALを作成する最良の方法は何ですか?
- 30. Java:一般的なHashMapマージメソッドを作成する正しい方法は何ですか?
+1は、シングルトンが本当に必要でないことを指摘しています。パターンを忠実にコピーすることなく意図を実装することができます。 –
私は、この点について懸命に考えてきました。なぜなら、それは、ルービックコアにおけるシングルトンモジュールの存在自体に疑問をもたらすからです。クラスとインスタンスメソッドの両方が必要な場合、2)複雑な初期化をしている場合は、モジュールメソッドを何らかの方法で明示的に起動させることなく遅延的に実行したい場合は、Singleton mixinのクラスの潜在的な有用性は2つに分かります彼らが初めてアクセスされたとき。他の誰かが実際のシングルトンモジュールの利点を持っていますか? – gtd