2017-05-28 16 views
1

例示的な例

ファイルb.rbには、以下の2つのクラスがあります。犬と猫。ルビーはなぜ「細かい」必要はないのですか?

Rubyで

、ファイルb.rbで定義されたクラス犬を使用するために、私はb.rbを要求する必要があります。

require 'b' 

puts Dog.new.bark 

しかし、私は猫を持っている必要はありませんが、それが定義されています必要なファイルのすべてのクラスがロードされているためです。

質問

だから私の質問です:なぜ、ファイルの一部のみを必要とする方法はRubyでありませんか?

Rubyでは必要でないと思われる理由があるのですか、それとも将来のロードマップに含まれているのでしょうか?

彼らは インポートファイルエクスポートするものを選択することができますされ、 インポートファイルをインポートするものを選択し、NodeJSの世界で彼らは module.exportを持っていることができます from module import MyClassフォームを、持っているPythonで

私には、PythonとNodeJSがはるかに柔軟性があるようです。ルビーの選択のトレードオフは何ですか?

その他の質問:python/nodeJSメカニズム(を選択的にインポートする)がどのように呼び出されていますか?

+2

これはRubyで 'require'が動作する方法です。 私はちょうどdog.rbに 'Dog'クラスを入れ、cat.rbに' Cat'を入れます。これは非常に直観的で、ファイルが乱雑にならないようにします。 – progfan

+0

私は、1つのファイルに複数のクラスを持つことは、ほとんどの場合悪い習慣であると主張しています - あるいは、少なくとも共通のRubyの慣習に従わないでください。 – spickermann

+1

それはちょっと別の哲学です。 Pythonパッケージは、スクリプトがほとんどなく、内部に多くのクラスがあります。 Rubyの宝石には多くのスクリプトがあり、1つのスクリプトにつき1つのクラスしかありません。 PythonはRubyよりも動的で明解ではないので、テキストエディタやIDEがPythonコードを分析する方が簡単です。 Pythonのクラス定義をどこに定義していても、それを簡単にジャンプできます。 Rubyでは、テキストエディタが基本的な規則を知る必要があるように、非常に多くの動的クラスとメソッド定義が存在する可能性があります。 –

答えて

3

それはちょうどrequireがどのように動作するかです:requireファイルを実行します。それでおしまい。それ以上のことはしません。

モジュールシステムをRubyに追加したい場合は、Rubyの動作方法が大幅に変更されます。

同じファイル内に無関係なクラスを定義しないでください。

+1

* "ファイルを実行する必要があります。それだけです。それ以上のことはありません。"まれに使用される 'load'は、ファイルを盲目的に実行します。 'require'はファイルがまだ実行されていない場合にのみ実行します。 –

+1

また、Rubyの 'require'の動作は、Cの' include'(MRIは 'C 'で書かれています)に似ています。だから、なぜ "ルビはこういうふうに振る舞うの?"と話しているのであれば、ここで答えられるのは、それが書かれた言語を模倣するということです。 –

+0

いいえ、 'require'は' #include 'に似ていません。 'require'はファイルを実行します。 '#include'は' #include'指令の代わりにファイルの内容を字句的に置き換えます。それは全く完全に異なっています。例えば、 '#include'dファイルは構文的に有効である必要はありません。文の先頭を含む1つのファイルと、その文の末尾を含む別のファイルを '#include 'できます。あるいは、より大きい関数の途中に部分式を含めることができます。 –

0

Jörgs answerに加えて、あなたはルビーのモジュールでロークをとることができます。

例。あなたのb.rbは、次のようになります。具体的に何が起こる

require_relative 'b' 

include Dogs 
puts Dogs::Dog.new.bark #->wuff wuff 
puts Dog.new.bark #->wuff wuff 

puts Cats::Cat.new.meouw #-> meouw 
puts Cat.new.meouw #-> Exception uninitialized constant Cat (NameError) 

require_relative 'b' 

あなたは、ファイルを読み込む

module Cats 
    class Cat 
    def meouw 
     puts 'meouw' 
    end 
    end 

end 

module Dogs 
    class Dog 
    def bark 
     puts 'wuff wuff' 
    end 
    end 
end 

あなたのスクリプトは次のようになります。これは、ファイルb.rb(クラスを定義しています)のすべてを実行します。

include Dogs 

モジュールDogsを実際の有効範囲にロードしていません。クラスDogが利用可能になりました。

puts Dogs::Dog.new.bark #->wuff wuff 
puts Dog.new.bark #->wuff wuff 

あなたはモジュールDogsの範囲内のクラスDogを使用するか、直接それを使用することができます。

puts Cats::Cat.new.meouw #-> meouw 

また、クラスCats::Catをロードして使用することもできます。

puts Cat.new.meouw #-> Exception uninitialized constant Cat (NameError) 

クラスCatは(あなたがimport Catsを作ったことがない)グローバルスコープではありませんので、あなたは例外を取得します。

最後の警告:b.rbの定義は不正なコーディングです。通常、dog.rbcat.rbを作成します。あなたはクラスを独立させることができます。

関連する問題