[解決済み] rubyのsingletonクラスとは何ですか?
2023-04-03 03:49:07
質問
Rubyのsingletonクラスはそれ自体がクラスなのでしょうか?すべてのオブジェクトが "クラスに属しているのはそのためですか?"その概念は
ファジー
ですが、なぜ私がクラスメソッドを定義できるのかに関係していると思います (
class foo; def foo.bar ...
).
Rubyのシングルトン・クラスとは何ですか?
どのように解決するのですか?
まず、ちょっとした定義です。 シングルトン・メソッド は、単一のオブジェクトに対してのみ定義されるメソッドです。 例として
irb(main):001:0> class Foo; def method1; puts 1; end; end
=> nil
irb(main):002:0> foo = Foo.new
=> #<Foo:0xb79fa724>
irb(main):003:0> def foo.method2; puts 2; end
=> nil
irb(main):004:0> foo.method1
1
=> nil
irb(main):005:0> foo.method2
2
=> nil
irb(main):006:0> other_foo = Foo.new
=> #<Foo:0xb79f0ef4>
irb(main):007:0> other_foo.method1
1
=> nil
irb(main):008:0> other_foo.method2
NoMethodError: undefined method `method2' for #<Foo:0xb79f0ef4>
from (irb):8
インスタンスメソッドは、クラスのメソッドです(つまり、クラスの定義で定義されています)。 クラスメソッドは、シングルトン・メソッドで
Class
インスタンスのシングルトン・メソッドで、クラスの定義では定義されていません。 そのかわり
シングルトン・クラス
に定義されます。
irb(main):009:0> Foo.method_defined? :method1
=> true
irb(main):010:0> Foo.method_defined? :method2
=> false
オブジェクトのシングルトン・クラスを開くには、次の構文で行います。
class << obj
. ここで、このシングルトン・クラスには、シングルトン・メソッドが定義されていることがわかります。
irb(main):012:0> singleton_class = ( class << foo; self; end )
=> #<Class:#<Foo:0xb79fa724>>
irb(main):013:0> singleton_class.method_defined? :method1
=> true
irb(main):014:0> singleton_class.method_defined? :method2
=> true
irb(main):015:0> other_singleton_class = ( class << other_foo; self; end )
=> #<Class:#<Foo:0xb79f0ef4>>
irb(main):016:0> other_singleton_class.method_defined? :method1
=> true
irb(main):017:0> other_singleton_class.method_defined? :method2
=> false
ですから、オブジェクトにシングルトンメソッドを追加する代替手段は、オブジェクトのシングルトンクラスを開いて定義することです。
irb(main):018:0> class << foo; def method3; puts 3; end; end
=> nil
irb(main):019:0> foo.method3
3
=> nil
irb(main):022:0> Foo.method_defined? :method3
=> false
まとめると
- メソッドは常にクラスに属していなければならない (または: あるクラスのインスタンスメソッドでなければならない)
- 通常のメソッドは、定義されたクラスに属する(つまり、クラスのインスタンスメソッドである)。
-
のシングルトン・メソッドに過ぎません。
Class
- オブジェクトのシングルトンメソッドは、そのオブジェクトのクラスのインスタンスメソッドではありません。
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] ...』の違い (ダブルドット) と '...' の違い?(トリプルドット)の違いについて教えてください。
-
[解決済み] key => "value"`と`key: "value"`のハッシュ表記に違いはありますか?
-
[解決済み] Rubyにおけるtapメソッドの利点
-
[解決済み] Sinatraがファイルを変更するたびに自動で再読み込みするようにするには?
-
[解決済み] RubyでDateTimeの時間部分を設定する
-
[解決済み] doブロックと中括弧{}の使い分け
-
[解決済み] Herokuの基本的なアプリのロードに2秒かかるのはなぜですか?
-
[解決済み] 文字列内の複数の空白と改行を削除する
-
[解決済み] Rubyでディレクトリを再帰的にリストアップするためのワンライナー?
-
[解決済み] クラスのインスタンスメソッドの一覧を取得する