Ruby require_relative
との違いは何require
ですか?
Ruby require_relative
との違いは何require
ですか?
回答:
ただドキュメントを見てください:
require_relative
ステートメントrequire
を含むファイルに関連するファイルをロードできるようにすることで、組み込みメソッドを補完しますrequire_relative
。たとえば、「test」ディレクトリにユニットテストクラスがあり、テスト用の「test / data」ディレクトリにそれらのデータがある場合、テストケースで次のような行を使用できます。
require_relative "data/customer_data_1"
require './file.rb'
とはrequire_relative 'file.rb'
?
require_relative
「ステートメントを含むファイルに関連require_relative
するファイルをロードする」ことができます。ではrequire
、./
現在の作業ディレクトリへの相対パスを示します。
require str
は常に$ LOAD_PATH内のディレクトリを検索することに注意することがより重要だと思います。require_relative
ロードする必要のあるファイルが、ロードを要求するファイルに対してどこかに存在する場合に使用してください。require
「外部」依存関係のために予約します。
require_relative
の便利なサブセットです require
require_relative('path')
等しい:
require(File.expand_path('path', File.dirname(__FILE__)))
__FILE__
定義されているLoadError
場合、またはそれ以外の場合は発生します。
これは以下を意味します:
require_relative 'a'
またrequire_relative './a'
、現在のファイル(__FILE__
)を基準にして必要です。
これは、結果が呼び出し元の現在のディレクトリに依存しないようにするため、ライブラリ内で必要なときに使用したいものです。
eval('require_relative("a.rb")')
内部で定義されていないLoadError
ために発生します。__FILE__
eval
これが、ed require_relative
を取得するRSpecテストで使用できない理由ですeval
。
次の操作は、でのみ可能require
です。
require './a.rb'
現在のディレクトリに対して相対的に必要
require 'a.rb'
検索パス($LOAD_PATH
)を使用して要求します。現在のディレクトリまたはパスに関連するファイルは検索されません。
require_relative
パスの検索は「ファイル名が絶対パスに解決されない」場合(つまり、/
or ./
またはで始まる場合../
)にのみ行われるとドキュメントで説明されているため、これは不可能です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 / data」ディレクトリにそれらのデータがある場合、テストケースで次のような行を使用できます。
require_relative "data/customer_data_1"
「test」も「test / data」も(おそらく正当な理由で)Rubyのライブラリパスにない可能性が高いため、通常のrequireはそれらを見つけることができません。require_relativeは、この特定の問題に対する優れたソリューションです。
ロードするファイルの拡張子(.rbまたは.so)を含めたり省略したりできます。
パスはto_strに応答する必要があります。
ドキュメントはhttp://extensions.rubyforge.org/rdoc/classes/Kernel.htmlにあります。
require
インストールされた宝石に使用require_relative
ローカルファイルに使用require
を使用して$LOAD_PATH
ファイルを検索します。
require_relative
ステートメントを使用してファイルの現在の場所を使用します
Requireはgem install [package]
、その機能のためにシステムのどこかにパッケージをインストール(例:)していることに依存しています。
使用require
するときは、現在のディレクトリのファイルに「」形式を使用できますが、これは一般的または推奨される方法ではないため、代わりに使用する必要があります。./
require "./my_file"
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をインストールしてからgem install activesupport
、ファイルにインストールする必要があります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
。
require_relative
ローダーはファイルを探すためにロードパスをたどる必要がないので、私の考えはそれよりも高速でした。基本的にrequire_relative
、直接リンクを提供します。
Windowsを使用require './1.rb'
するときにスクリプトをローカルまたはマップされたネットワークドライブから実行\\servername\sharename\folder
する場合に使用できますが、UNC パスから実行する場合は使用する必要があることを追加しますrequire_relative './1.rb'
。
私は他の理由でどちらを使用するかについての議論に混じりません。
require_relative
ファイルを使用すると、この時にアイデアを投げてもらえ stackoverflow.com/questions/43487784/...
$:
。stackoverflow.com/questions/2900370を