質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

3回答

1446閲覧

Rubyのrequireで読込先のパスとは

nakasho

総合スコア11

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2021/05/13 10:18

プロを目指す人のためのRuby入門(俗に言うチェリー本)P81において、テストファイルからfizz_buzzメソッドの定義を読み込むため、

require './lib/fizz_buzz'

を追加して実行してます。

しかし、エラーとなってしまいます。
なぜでしょうか?

ファイル構成及びコードは以下の通りです

ruby-book | |- lib/ |  |- fizz_buzz.rb | |- test/ |- fizz_buzz_test.rb

ruby

1#fizz_buzz_test.rb 2 3require 'minitest/autorun' 4require './lib/fizz_buzz.rb' 5 6class FizzBuzzTest < Minitest::Test 7 def test_fizz_buzz 8 省略 9 end 10end
#結果 > `require': cannot load such file -- ./lib/fizz_buzz.rb (LoadError)

ちなみに、require './lib/fizz_buzz.rb'を

require '../lib/fizz_buzz.rb'

または

require_relative '../lib/fizz_buzz.rb'

にして、実行すると、正常にテストが実行されます。

5/13本日現在、サポートサイトで誤植とはなっていないです
https://gihyo.jp/book/2017/978-4-7741-9397-7/support#supportApology

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2021/05/13 10:27 編集

ディレクトリ構成も本の通りになっていますか?
nakasho

2021/05/13 10:39

なっています。
guest

回答3

0

ベストアンサー

require.で始まる相対パスを使った場合は、その相対パスの起点はそれを書いたファイルのありかとは無関係です。
この場合の起点はカレントディレクトリーなので、その階層状況で実行したければ、cdコマンドでlibtestがある階層にカレントディレクトリーを移動させれば良いです。

sh

1cd /path/to/ruby-book 2ruby test/fizz_buzz_test.rb

ちなみに、require './lib/fizz_buzz.rb'を

require '../lib/fizz_buzz.rb'

にして、実行すると、正常にテストが実行されます。

というのは、カレントディレクトリーがtestの状態で実行したのでしょうね。

「それを書いたファイルのありかを起点とした相対パス」を使いたい時はrequire_relative使います。

投稿2021/05/13 12:08

otn

総合スコア84800

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

requireのライブラリは、相対パスで書いた場合、$:という名前の変数からパスを探して参照することになっています(るりま)。

何かしらの設定が事前にしてあったものと思われます。

投稿2021/05/13 11:08

maisumakun

総合スコア145208

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

require_relativeに以下の記述があります(強調引用者)。

Ruby tries to load the library named string relative to the requiring file's path.

この場合、呼び出しているファイルは test/fizz_buzz_test.rb であり、呼び出されているファイルは lib/fizz_buzz.rb です。
したがって前者から後者への相対パスとして ../lib/fizz_buzz.rb を指定する必要があります。

投稿2021/05/13 10:26

gemmaro

総合スコア358

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nakasho

2021/05/13 12:39

みなさま、ご回答ありがとうございます。 おかげさまで解決いたしました! チェリー本では、/ruby-bookのディレクトリから、ruby test/fizz_buzz_test.rbを実行していたのに対して、 私は、/ruby-book/testのディレクトリから、ruby fizz_buzz_test.rb を実行していたからでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問