Ruby オブジェクト モデルを理解しようとしています。インスタンスメソッドは、クラスのオブジェクトではなくクラスに保存されるため、冗長性がなくなることがわかりました。クラスが作成されるたびに、新しく作成されたクラスのメタクラスも作成されることを読みました。メタクラスはクラス メソッドを格納します。つまり、クラスのシングルトン メソッドはメタクラスに配置されます。例えば
class MyClass
def hi
'hi object'
end
def self.bye
'bye singleton method'
end
end
上記の MyClass に対して、メタクラス (#MyClass など) も作成されます。メソッド 'hi' はインスタンス レベルのメソッドになり、MyClass のすべてのオブジェクトで呼び出すことができます。メソッド 'bye' は MyClass のシングルトン メソッドであり、#MyClass に存在します。'hi' が MyClass のすべてのオブジェクトではなく MyClass に保存される理由 (私はそう思います) は、冗長性を避けるためです。ただし、MyClass という名前のクラスを複数持つことはできません。複数の MyClass を持つことはできないため、#MyClass ではなく MyClass に 'bye' を格納しないでください。なぜこれがそうなのかはまったくわかりませんが、その背後にある理由を理解しようとしています。
- - -アップデート - -
メタクラスには、シングルトン メソッドなどのクラス情報が格納されます。しかし、クラスはシングルトン オブジェクト (クラス Class のインスタンスであり、その型だけである) であるため、すべての情報をメタクラスではなくクラス自体に保存しないでください。