RubyクラスFoo::Bar
を考えてみましょう。クラスとモジュールのRuby名前空間?
大会は、モジュールなるように「フー」名前空間のですが、それは同じように簡単にクラスのようになります。
module Foo; class Bar; end; end
対:第2のケースで
class Foo; class Bar; end; end
、Bar
Foo
の内部クラスではなく、シングルトンで定義されたもう1つの定数、Foo
です。どちらの場合でもスーパークラスはObjectであり、カーネルモジュールのみを含みます。彼らの祖先の鎖は同じです。
Foo
は、クラスに応じて操作できます(モジュールの場合はクラスを拡張/インクルードします)、名前空間の性質はBar
に影響しますか?名前空間の多くを別のものよりも選択する魅力的な理由はありますか?
私が見ることができる奇妙なものは、それぞれFoo::Bar.new.extend Foo
とFoo.new.class::Bar
です。
:私はこの議論に見つけ
class Foo
Bar = Struct.new(:something) do
def digest
puts "eating #{something}"
end
end
def eat(something)
Bar.new(something).digest
end
end
最も近いです「Using Class vs Module for packaging code in Ruby」にあります。
興味深いことに、私はRailsの中に、関連する問題があった見ますconst_missingを使用してhttp://bugs.ruby-lang.org/issues/2740 – BF4