私の質問は「 Ruby のインクルードとエクステンドの違いは何ですか? 」に似ています。
Rubyのrequire
との違いは何ですか? include
クラスでモジュールのメソッドを使用したいだけの場合、それを使用する必要がありますrequire
かinclude
?
私の質問は「 Ruby のインクルードとエクステンドの違いは何ですか? 」に似ています。
Rubyのrequire
との違いは何ですか? include
クラスでモジュールのメソッドを使用したいだけの場合、それを使用する必要がありますrequire
かinclude
?
Rubyの「含める」と「要求する」の違いは何ですか?
答え:
include メソッドと require メソッドは、非常に異なることを行います。
require メソッドは、他のほとんどのプログラミング言語で include が行うこと、つまり別のファイルを実行することを行います。また、過去に必要なものを追跡し、同じファイルを 2 回必要としません。この追加機能なしで別のファイルを実行するには、load メソッドを使用できます。
include メソッドは、別のモジュールからすべてのメソッドを取得し、それらを現在のモジュールに含めます。これは、require のようなファイル レベルの処理とは対照的に、言語レベルの処理です。include メソッドは、クラスを他のモジュールで「拡張」するための主要な方法です (通常、ミックスインと呼ばれます)。たとえば、クラスでメソッド「each」が定義されている場合、mixin モジュール Enumerable を含めることができ、コレクションとして機能できます。include動詞は他の言語では非常に異なる方法で使用されるため、これは混乱を招く可能性があります。
したがって、モジュールを拡張したりミックスインしたりするのではなく、単にモジュールを使用したい場合は、require
.
奇妙なことに、Rubyrequire
は C に似ていますが、 include
Rubyは Cinclude
とはほとんど似ていませんinclude
。
If you're using a module, that means you're bringing all the methods into your class.
If you extend
a class with a module, that means you're "bringing in" the module's methods as class methods.
If you include
a class with a module, that means you're "bringing in" the module's methods as instance methods.
EX:
module A
def say
puts "this is module A"
end
end
class B
include A
end
class C
extend A
end
B.say
=> undefined method 'say' for B:Class
B.new.say
=> this is module A
C.say
=> this is module A
C.new.say
=> undefined method 'say' for C:Class
メタプログラミングRubyの本から、
require()
メソッドは とよく似ていますload()
が、目的が異なります。を使用load()
してコードを実行し、を使用require()
してライブラリをインポートします。
Rubyrequire
は、他の言語 (C など) の「インクルード」に似ています。別のファイルの内容を取り込みたいことを Ruby に伝えます。他の言語の同様のメカニズムは次のとおりです。
Rubyinclude
はmixin に使用されるオブジェクト指向の継承メカニズムです。
ここに良い説明があります:
[その]簡単な答えは、require と include は本質的に無関係だということです。
「require」は C の include に似ており、初心者の混乱を招く可能性があります。(注目すべき違いの 1 つは、require が完了すると、required ファイル内の locals が「蒸発」することです。)
Rubyインクルードは、C インクルードとはまったく異なります。include ステートメントは、モジュールをクラスに「混在」させます。これは多重継承の限定的な形式です。含まれるモジュールは、それを含むものに文字通り「is-a」関係を与えます。
強調が追加されました。
インクルード 以下に示すようにモジュールをクラスにインクルードすると、モジュール内で定義されたコードを取り、それを「インクルード」するクラス内に挿入したかのようになります。「ミックスイン」動作を許可します。たとえば、モジュール内に同じコードを必要とするクラスが複数ある場合など、重複を避けるためにコードをドライアップするために使用されます。
Load load メソッドは、そのライブラリがロードされているかどうかを追跡しない点を除けば、require メソッドとほとんど同じです。そのため、ライブラリを複数回ロードすることが可能であり、ロード メソッドを使用する場合は、ライブラリ ファイル名の拡張子「.rb」を指定する必要があります。
Require require メソッドを使用すると、ライブラリをロードでき、ライブラリが複数回ロードされるのを防ぐことができます。初めて同じライブラリをロードしようとすると、require メソッドは「false」を返します。require メソッドは、ロードするライブラリが別のファイルで定義されている場合にのみ使用する必要があります (通常はそうです)。
これを好むことができます http://ionrails.com/2009/09/19/ruby_require-vs-load-vs-include-vs-extend/