2

私はこのコードを持っています:

class A
  def print
    puts CONSTANT
  end
end

module B
  CONSTANT = "Don't Panic!"
end

aがクラス A のインスタンスであるとします。

CONSTANTそのため、利用可能にするために見つけることができる定義が必要a.printです。

次のようなシングルトンクラスにモジュールを含めることを検討しましたBa

a.singleton_class.send :include, B

a.print   # error: CONSTANT isn't found

メソッドを呼び出しても問題ないと思いましたが、実際にはそうではありません。

次のコードが期待どおりに機能するため、定数は正常にインポートされるはずです。

a.singleton_class.constants  # => [.., :CONSTANT, ..]

ただし、singleton classの代わりに定数をクラスに含めることで、次のように機能します。

a.class.send :include, B

a.print   # prints: Don't Panic!

シングルトンクラスで定義された定数を参照できないのはおかしいと思いました。これが合理的である場合、その理由を知りたいです。

前もって感謝します。

4

1 に答える 1

2

によって返されるsingleton_classクラスは、オブジェクトのクラスから継承された無名クラスaです。

したがってa.classa.singleton_classさまざまなオブジェクトを参照してください。

puts a.class.object_id           # => 79495930
puts a.singleton_class.object_id # => 79495830

また、さまざまなクラス:a.singleton_classの子クラスですA

a.singleton_class.superclass # => A 

a.singleton_class.ancestors  # => [B, A, Object, Kernel, BasicObject] 
a.class.ancestors            # => [A, Object, Kernel, BasicObject] 

このため、a.singleton_class他の子クラスと同じように、独自の定数を親と共有しません。

puts a.class.constants             # => []
puts a.singleton_class.constants   # => [:CONSTANT]
于 2012-07-31T00:36:38.777 に答える