3

2つの質問があります:

  1. メソッドf_1はメタクラス匿名クラスに属していますか?
  2. メソッドf_2は匿名クラスに属していますか?

次のコードに関連しています。

car = "car"

class << car
  def self.f_1
    puts "f_1"
  end
  def f_2
    puts "f_2"
  end
end
4

4 に答える 4

4

ルビー自身のAPIは「シングルトンクラス」という用語を使用しているので、次のことが当てはまります。

  1. f_1車のシングルトンクラスのクラスメソッドであり、次のように呼び出すことができます。

    car.singleton_class.f_1
    
  2. f_2車のシングルトンクラスのインスタンスメソッドであり、次のように呼び出すことができます。

    car.f_2
    
于 2011-06-16T18:59:12.987 に答える
2

まあ、用語は壊れやすいですが、FWIWあなたのクラスは実際には匿名のクラスではなかったと思います。所属に関しては、これらのメソッドは両方とも車のオブジェクトにのみ存在します。

私は正直に言って、クラスがこのように個々のオブジェクトに対して定義されている場合、クラスメソッドとインスタンスメソッドの違いについて少し漠然としていることを認めます-違いがある場合は、コードを読みにくくするようなあいまいなものにしてください;)

更新:これまでに見たことがない場合は、これが役立つ場合があります。(個人的には頭が痛くなりますが、みんな違います...)

于 2011-06-16T18:40:09.953 に答える
0

匿名クラスは名前のないクラスであるという印象を受けました。

my_class = Class.new
my_class.name # => nil

ただし、Pickaxeは、匿名クラスではなく、名前のないクラスとして参照します。

于 2011-06-17T00:05:20.667 に答える
0

ロブデイビスの答えの再定式化:

  1. のメソッド所有者は:f_1ですcar.singleton_class.singleton_class
  2. のメソッド所有者は:f_2ですcar.singleton_class

チェーンcar→→は、 http://www.atalon.cz/rb-om/ruby-object-model/#sc-inheritance-samplecar.singleton_classcar.singleton_class.singleton_class図の一番下の行に対応します。

ノート:

  • このコードは新しいクラスを作成しません(特に、匿名クラスは作成されません)。
  • ほとんどのRubyプログラムでは、固有クラスの固有クラスは「実際」にはなりません(http://www.atalon.cz/rb-om/ruby-object-model/#actual-listsを参照)。
于 2011-07-27T08:20:54.110 に答える