2013-10-24 13 views
6

RubyクラスFoo::Barを考えてみましょう。クラスとモジュールのRuby名前空間?

大会は、モジュールなるように「フー」名前空間のですが、それは同じように簡単にクラスのようになります。

module Foo; class Bar; end; end 

対:第2のケースで

class Foo; class Bar; end; end 

BarFooの内部クラスではなく、シングルトンで定義されたもう1つの定数、Fooです。どちらの場合でもスーパークラスはObjectであり、カーネルモジュールのみを含みます。彼らの祖先の鎖は同じです。

Fooは、クラスに応じて操作できます(モジュールの場合はクラスを拡張/インクルードします)、名前空間の性質はBarに影響しますか?名前空間の多くを別のものよりも選択する魅力的な理由はありますか?

私が見ることができる奇妙なものは、それぞれFoo::Bar.new.extend FooFoo.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」にあります。

+0

興味深いことに、私はRailsの中に、関連する問題があった見ますconst_missingを使用してhttp://bugs.ruby-lang.org/issues/2740 – BF4

答えて

5

名前空間のためのモジュールを使用する最も直接的な利益はあなたが名前空間をインポートするincludeを使用して、修飾されていないことの中で宣言された定数を使用することができるということです。

module Foo; class Bar; end; end 

module Elsewhere 
    include Foo 
    Bar.new 
end 
+0

さて、私は、モジュールを使用することが意図されていることを説得力のある議論として見ることができます。しかし、意図していなければ、ほとんどの宝石のように、 gemのトップネームスペースを混在させると、既存の定数との衝突が起こりやすくなります。 – BF4

+0

私はもっと答えを得なければこれを受け入れます(私はそれをアップアップしました)が、より完全なものを望んでいました。 – BF4

+2

ありがとう、ありがとう。私が考えることができる唯一の他の理由は、「コンベンション」と「意図の明確化」であり、どちらもそれよりはるかに満足です。 Classは実際にはインスタンス化を実装するModuleのサブクラスであるため、ClassとModuleは機械的に非常に近いです。それ以前には、実際の独立した名前空間の構造がうまくいくと思っていましたが、実際にどのような動作が追加されるのかはわかりません。 –

関連する問題