2つの質問があります:
- メソッド
f_1
はメタクラス匿名クラスに属していますか? - メソッド
f_2
は匿名クラスに属していますか?
次のコードに関連しています。
car = "car"
class << car
def self.f_1
puts "f_1"
end
def f_2
puts "f_2"
end
end
2つの質問があります:
f_1
はメタクラス匿名クラスに属していますか?f_2
は匿名クラスに属していますか?次のコードに関連しています。
car = "car"
class << car
def self.f_1
puts "f_1"
end
def f_2
puts "f_2"
end
end
ルビー自身のAPIは「シングルトンクラス」という用語を使用しているので、次のことが当てはまります。
f_1
車のシングルトンクラスのクラスメソッドであり、次のように呼び出すことができます。
car.singleton_class.f_1
f_2
車のシングルトンクラスのインスタンスメソッドであり、次のように呼び出すことができます。
car.f_2
まあ、用語は壊れやすいですが、FWIWあなたのクラスは実際には匿名のクラスではなかったと思います。所属に関しては、これらのメソッドは両方とも車のオブジェクトにのみ存在します。
私は正直に言って、クラスがこのように個々のオブジェクトに対して定義されている場合、クラスメソッドとインスタンスメソッドの違いについて少し漠然としていることを認めます-違いがある場合は、コードを読みにくくするようなあいまいなものにしてください;)
更新:これまでに見たことがない場合は、これが役立つ場合があります。(個人的には頭が痛くなりますが、みんな違います...)
匿名クラスは名前のないクラスであるという印象を受けました。
my_class = Class.new
my_class.name # => nil
ただし、Pickaxeは、匿名クラスではなく、名前のないクラスとして参照します。
ロブデイビスの答えの再定式化:
:f_1
ですcar.singleton_class.singleton_class
。:f_2
ですcar.singleton_class
。チェーンcar
→→は、 http://www.atalon.cz/rb-om/ruby-object-model/#sc-inheritance-samplecar.singleton_class
のcar.singleton_class.singleton_class
図の一番下の行に対応します。
ノート: