web-dev-qa-db-ja.com

ロードはローカルパスで機能しますが、必要ありません

loadee.rb

puts '> This is the second file.'

loaddemo.rb

puts 'This is the first (master) program file.'
load 'loadee.rb'
puts 'And back again to the first file.'

"Ruby loaddemo.rb"を実行すると、これは正常に機能します。両方のファイルは同じディレクトリにあり、それが私が実行するディレクトリです。

しかし、負荷をrequireに変更し、拡張機能の有無にかかわらず、次のようになります。

<internal:lib/rubygems/custom_require>:29:in `require': no such file to load
 -- loadee.rb (LoadError)
        from <internal:lib/rubygems/custom_require>:29:in `require'
        from loaddemo.rb:2:in `<main>'

私の質問はもちろんですが、なぜこの場合は作業する必要がないのですか?そうすべきですよね?ロードし、異なるパスを使用する必要がありますか?

Rubyバージョン1.9.2

22

requireにファイル名だけを指定すると、事前定義された$LOAD_PATHディレクトリのみが検索されます。ただし、ファイル名にパスを指定すると、次のように機能するはずです。

puts 'This is the first (master) program file.'
require './loadee.rb'
puts 'And back again to the first file.'

代わりに、プロジェクトのフォルダーをロードパスに追加することもできます。

$LOAD_PATH.unshift File.dirname(__FILE__)
puts 'This is the first (master) program file.'
require 'loadee.rb'
puts 'And back again to the first file.'

そして最後に、代わりにrequire_relativeを使用できます。

puts 'This is the first (master) program file.'
require_relative 'loadee.rb'
puts 'And back again to the first file.'
39
Dylan Markow

ファイル名を使用してパスを指定してもうまくいかないようで、$LOAD_PATHに大量のパスを詰め込みたくありませんでした。

ドキュメント をチェックすると、require_relativeが見つかりました。

require_relative 'loadee'

1.9.22.1.2の両方で機能します。

documentation は、requireが相対パスを検索することをまったく意図しておらず、loadも検索しないことを示しています。

5
Keen