Rubyのrequire_relative
との違いは何ですか?require
8 に答える
ドキュメントを見てください:
require_relative
ステートメントrequire
を含むファイルに関連するファイルをロードできるようにすることで、組み込みメソッドを補完します。require_relative
たとえば、単体テスト クラスが "test" ディレクトリにあり、それらのデータが test "test/data" ディレクトリにある場合、テスト ケースで次のような行を使用できます。
require_relative "data/customer_data_1"
require_relative
の便利なサブセットですrequire
require_relative('path')
等しい:
require(File.expand_path('path', File.dirname(__FILE__)))
if__FILE__
が定義されているか、LoadError
それ以外の場合に発生します。
これは、次のことを意味します。
require_relative 'a'
現在のファイル( )require_relative './a'
に相対的な必要があります。__FILE__
結果を呼び出し元の現在のディレクトリに依存させたくないので、これはライブラリ内で require するときに使用したいものです。
eval('require_relative("a.rb")')
は内部で定義されていないLoadError
ため発生します。__FILE__
eval
これが、 ed
require_relative
を取得する RSpec テストで使用できない理由です。eval
次の操作は、 でのみ可能require
です。
require './a.rb'
現在のディレクトリに相対する必要がありますrequire 'a.rb'
検索パス ($LOAD_PATH
) を使用して require します。現在のディレクトリまたはパスに関連するファイルは検索されません。ドキュメントによると、パス検索は「ファイル名が絶対パスに解決されない」(つまり、or
require_relative
で始まる)場合にのみ発生すると書かれているため、これは不可能です。/
./
../
File.expand_path
次の操作は両方で可能ですが、require
より短くて効率的なため、使用することをお勧めします。
require '/a.rb'
どちらもrequire_relative '/a.rb'
絶対パスが必要です。
ソースを読む
ドキュメントが明確でない場合は、ソースを確認することをお勧めします (ドキュメント内のソースを切り替えます)。場合によっては、何が起こっているのかを理解するのに役立ちます。
必要とする:
VALUE rb_f_require(VALUE obj, VALUE fname) {
return rb_require_safe(fname, rb_safe_level());
}
require_relative:
VALUE rb_f_require_relative(VALUE obj, VALUE fname) {
VALUE base = rb_current_realfilepath();
if (NIL_P(base)) {
rb_loaderror("cannot infer basepath");
}
base = rb_file_dirname(base);
return rb_require_safe(rb_file_absolute_path(fname, base), rb_safe_level());
}
これにより、次のように結論付けることができます。
require_relative('path')
以下と同じです:
require(File.expand_path('path', File.dirname(__FILE__)))
なぜなら:
rb_file_absolute_path =~ File.expand_path
rb_file_dirname1 =~ File.dirname
rb_current_realfilepath =~ __FILE__
Ruby API から:
require_relative は、require_relative ステートメントを含むファイルに関連するファイルをロードできるようにすることで、組み込みメソッドの require を補完します。
require を使用してファイルをロードする場合、通常、システムに適切にインストールされ、アクセス可能になっている機能にアクセスしています。require は、プロジェクトのコード内でファイルをロードするための適切なソリューションを提供しません。これは、開発段階で、テスト データにアクセスする場合や、外部での使用を意図していないプロジェクト内で「ロック」されているファイルにアクセスする場合にも役立ちます。
たとえば、単体テスト クラスが "test" ディレクトリにあり、それらのデータが test "test/data" ディレクトリにある場合、テスト ケースで次のような行を使用できます。
require_relative "data/customer_data_1"
"test" も "test/data" も Ruby のライブラリ パスに含まれていない可能性が高いため (正当な理由により)、通常の require ではそれらを見つけることができません。require_relative は、この特定の問題に対する優れたソリューションです。
ロードするファイルの拡張子 (.rb または .so) を含めても省略してもかまいません。
path は to_str に応答する必要があります。
ドキュメントはhttp://extensions.rubyforge.org/rdoc/classes/Kernel.htmlにあります。
概要
require
インストールされた宝石に使用
require_relative
ローカルファイルに使用
require
を使用し$LOAD_PATH
てファイルを検索します。
require_relative
ステートメントを使用してファイルの現在の場所を使用します
必要とする
gem install [package]
Require は、その機能のためにシステムのどこかにパッケージを (たとえば) インストールしたことに依存します。
を使用する場合require
、現在のディレクトリ内のファイルに" " 形式を使用できます。たとえば、これは一般的または推奨される方法ではなく、代わりに使用する必要があります。./
require "./my_file"
require_relative
require_relative
これは単に、「require_relative ステートメントを使用してファイルの場所に相対的な」ファイルを含めることを意味します。通常、ファイルは現在のディレクトリ ツリーの「上」ではなく「内」にあることをお勧めします。たとえば、使用しないでください。
require_relative '../../../filename'
(ディレクトリ レベルを 3 つ上に) ファイル システム内に配置すると、不要で脆弱な依存関係が作成される傾向があるためです。ただし、場合によっては、ディレクトリ ツリー内で既に「深い」場合は、別のディレクトリ ツリー ブランチを「上下」に移動する必要がある場合があります。もっと簡単に言えば、このリポジトリ以外のファイルに require_relative を使用しないでください(2018 年後半の現時点で主に事実上の標準となっている git を使用していると仮定します)。
require_relativeステートメントでファイルrequire_relative
の現在のディレクトリを使用することに注意してください(コマンドを使用している現在のディレクトリとは限りません)。これにより、パスは常に同じ方法で必要なファイルに対して相対的であるため、パスが「安定」に保たれます。require_relative
上位の回答は正しいですが、非常に専門的です。Ruby を初めて使用する場合:
require_relative
ほとんどの場合、作成した別のファイルからコードを取り込むために使用されます。
たとえば、 にデータが~/my-project/data.rb
あり、それを に含めたい場合はどうすればよいでしょ~/my-project/solution.rb
うか? solution.rb
を追加しrequire_relative 'data'
ます。
これらのファイルが同じディレクトリにある必要はないことに注意してください。 require_relative '../../folder1/folder2/data'
も有効です。
require
ほとんどの場合、他の誰かが書いたライブラリからコードを取り込むために使用されます。
たとえば、active_support
ライブラリで提供されているヘルパー関数の 1 つを使用したい場合はどうでしょうか。gem install activesupport
でgemをインストールしてからファイルにインストールする必要がありますrequire 'active_support'
。
require 'active_support/all'
"FooBar".underscore
言い方が違う――
require_relative
それを呼び出すファイルに対して相対的に指定されたファイルが必要です。require
に含まれるファイルが必要です$LOAD_PATH
。
RSpec のコードにrequire_relative
、O(1) 定数でありrequire
、O(N) 線形であるというコメントがあるのを見たところです。したがって、おそらく違いは、それrequire_relative
がよりも優先されることですrequire
。
Windows を使用するrequire './1.rb'
場合、スクリプトをローカルまたはマップされたネットワーク ドライブから実行する場合は使用できますが、UNC\\servername\sharename\folder
パスから実行する場合はrequire_relative './1.rb'
.
他の理由でどちらを使用するかについては議論しません。