Rubyのrequire_relativeとrequireの違いは何ですか?


302

Ruby require_relativeとの違いは何requireですか?


9
1.9.2より前は、スクリプトの現在のディレクトリがにあるため、require_relativeは必要ありませんでした$:stackoverflow.com/questions/2900370を
Nakilon

1
require_relativeは、それを呼び出すファイルを基準にして相対的に指定されたファイルを必要とします。requireは$ LOAD_PATHに含まれるファイルを必要とします。
Donato

違い=>に関する有用な記事medium.com/@ellishim/...
アーメドhamdy

回答:


298

ただドキュメントを見てください:

require_relativeステートメントrequireを含むファイルに関連するファイルをロードできるようにすることで、組み込みメソッドを補完しますrequire_relative

たとえば、「test」ディレクトリにユニットテストクラスがあり、テスト用の「test / data」ディレクトリにそれらのデータがある場合、テストケースで次のような行を使用できます。

require_relative "data/customer_data_1"

28
間に差があるrequire './file.rb'とはrequire_relative 'file.rb'
Ciro Santilli郝海东冠状病六四事件法轮功

69
@CiroSantilliはい。require_relativeステートメントを含むファイルに関連require_relativeするファイルをロードする」ことができます。ではrequire./現在の作業ディレクトリへの相対パスを示します。
Ajedi32 2014年

16
require strは常に$ LOAD_PATH内のディレクトリを検索することに注意することがより重要だと思います。require_relativeロードする必要のあるファイルが、ロードを要求するファイルに対してどこかに存在する場合に使用してください。require「外部」依存関係のために予約します。
rthbound '30 / 09/15

97

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__

74

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にあります


50

概要

requireインストールされた宝石に使用

require_relativeローカルファイルに使用

requireを使用して$LOAD_PATHファイルを検索します。
require_relativeステートメントを使用してファイルの現在の場所を使用します


必要とする

Requireはgem install [package]、その機能のためにシステムのどこかにパッケージをインストール(例:)していることに依存しています。

使用requireするときは、現在のディレクトリのファイルに「」形式を使用できますが、これは一般的または推奨される方法ではないため、代わりに使用する必要があります。./require "./my_file"require_relative

require_relative

これは単に、「require_relativeステートメントを使用したファイルの場所を基準にして」ファイルを含めることを意味します。私は一般に、ファイルを「上」ではなく、現在のディレクトリツリーの「内」に配置することをお勧めします。たとえば、使用しないでください。

require_relative '../../../filename'

(3つ上のディレクトリレベル)ファイルシステム内。これにより、不要で壊れやすい依存関係が作成される傾向があります。ただし、場合によっては、ディレクトリツリー内ですでに「深い」場合、別のディレクトリツリーブランチを「上下に」移動する必要があります。もっと簡単に言うと、このリポジトリの外のファイルにはrequire_relativeを使用しないください(現時点では2018年後半に、主に事実上の標準であるgitを使用していると想定しています)。

はrequire_relativeステートメントでファイルのrequire_relative現在のディレクトリを使用していることに注意してください(コマンドを使用している現在のディレクトリとは限りません)。これは、常に同じ方法でパスを必要とするファイルに対して相対的であるため、パスを「安定」させます。require_relative


27

上の答えは正しいですが、非常に技術的です。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


3
どうすればこの回答に賛成票を投じ、一番上に表示できるので、この質問ページのすべての訪問者は、頭を壊すことなく、明確で理解できる回答をすぐに得ることができますか?
TiredOfProgramming 2018年

16

私は、RSpecのコードがrequire_relativeO(1)定数であるrequireこととO(N)線形であることについていくつかのコメントを持っているのを見ました。したがって、おそらく違いは、それrequire_relativeよりも優先されることですrequire


1
面白い。私は速度比較に関する情報を探してここに着陸しました。require_relativeローダーはファイルを探すためにロードパスをたどる必要がないので、私の考えはそれよりも高速でした。基本的にrequire_relative、直接リンクを提供します。
Clint Pachl、2015年

require_relative速度とRSpec changelogについての初期の議論。
Clint Pachl 2015年

1

Windowsを使用require './1.rb'するときにスクリプトをローカルまたはマップされたネットワークドライブから実行\\servername\sharename\folderする場合に使用できますが、UNC パスから実行する場合は使用する必要があることを追加しますrequire_relative './1.rb'

私は他の理由でどちらを使用するかについての議論に混じりません。


私はあなたがロードしない方法を知りたいと思ったrequire_relativeファイルを使用すると、この時にアイデアを投げてもらえ stackoverflow.com/questions/43487784/...
Emjey
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.