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

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

ただいまの
回答率

89.07%

rgb変換プログラムの作成

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 295

pome00000

score 5

前提・実現したいこと

現在ruby入門(チェリー本)の4章を解いておりますが
4章の例題 RGB変換プログラムの作成でエラーが出てしまっているため
アドバイス頂きたいです。

発生している問題・エラーメッセージ

現在、rgb_test.rbという名前のMinitestを作成し
to_hexメソッドとして本の通りlibディレクトリにrgd.rbというファイルを作成しました。そしてテストを実行したところ以下のエラーが出てしまいました。
rgb_test.rbの中身↓
イメージ説明
rgd.rbの中身↓
イメージ説明

エラーメッセージ
/home/vagrant/.rbenv/versions/2.3.1/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- ./lid/rgb (LoadError)
    from /home/vagrant/.rbenv/versions/2.3.1/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'
    from rgb_test.rb:2:in `<main>'

ここに言語名を入力
Ruby

試したこと

rgbファイルのディレクトリを変えてみたり、作り直しましたができない状態でした。
勉強してまだ日が浅く質問に必要な情報等記載漏れがあるかもしれません…!
よろしくお願いします……!

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

「プロを目指す人のためのRuby入門」の著者の伊藤です。本書をお読みいただき、どうもありがとうございます。

最初に本題と関係なところを書きますが、スクショを見ると./lid/rgbとなっていますね。
本書では./lib/rgbと書いているので、この説明でもlibで統一します。
(ちなみにlibはlibrary=ライブラリの略です)

エラーの原因について

otnさんもすでに回答されているとおり、プログラムを実行する場合はカレントディレクトリを意識する必要があります。
つまり、どのディレクトリでrubyコマンドを実行するか、ということが大事です。

本書の説明通りにファイルを作成していくと、以下のようなディレクトリ構成になると思います。

.
├-- lib
│   └-- rgb.rb
└-- test
    └-- rgb_test.rb

そして、例題の解答例を実行する場合は下記のディレクトリをカレントディレクトリとして実行する必要があります。

. ←このディレクトリで実行する!!
├-- lib
│   └-- rgb.rb
└-- test
    └-- rgb_test.rb

カレントディレクトリを確認するコマンドはpwdです。また、lsコマンドを使うと、カレントディレクトリの配下にあるファイルやディレクトリを確認できます。

$ pwd
/Users/jnito/dev/private/ruby-book-codes/ruby-book

$ ls
lib      test

上の実行例のように、lsを実行したときにlibtestが表示されれば、カレントディレクトリが正しいです。

ですが、pome00000さんはおそらく、testディレクトリをカレントディレクトリにしてrubyコマンドを実行したんじゃないかと推測します。

.
├-- lib
│   └-- rgb.rb
└-- test ←ここがカレントディレクトリになっていたのでは?
    └-- rgb_test.rb

その状態だと、pwdlsの実行結果が以下のようになります。

# "test"で終わっているので、カレントディレクトリがtestディレクトリになっている
$ pwd
/Users/jnito/dev/private/ruby-book-codes/ruby-book/test

# "lib"や"test"がなく、テストコードのrgb_test.rbしか表示されない
$ ls
rgb_test.rb

また、カレントディレクトリが異なると、テストコードを実行するときのコマンドも微妙に変わってきます。

# OK: 正しいカレントディレクトリであれば、"test"ディレクトリの下にある"rgb_test.rb"を実行する
$ ruby test/rgb_test.rb

# NG: "test"ディレクトリがカレントディレクトリだと、"test/"なしで実行することになる
$ ruby rgb_test.rb

本書で実行例として提示しているのもruby test/rgb_test.rbです。

イメージ説明

require './lib/rgb'と書いた場合は、「カレントディレクトリの下のlibディレクトリの下のrgb.rbファイル」を読み込みに行きます。
そのため、カレントディレクトリがtestディレクトリになっていると、「testディレクトリの下のlibディレクトリの下のrgb.rbファイル」を探しに行くので、「そんなファイルはありません!」とエラーが発生します。

解決策1(本書を読み進める上では非推奨)

解決策のひとつはotnさんが書かれたように、require './lib/rgb'の代わりにrequire_relative '../lib/rgb'のように書くことです。
require_relativeを使うとカレントディレクトリに関係なく、「自分のファイルパスから見た相対パス」を読み込みます。
なので、require_relative '../lib/rgb'と書いた場合は、「test/rgb_test.rbのひとつ上のディレクトリに上がり、その下にあるlibディレクトリの下にあるrgb.rbファイル」を読み込むので、正しくファイルが読み込まれるはずです。

ただし、本書ではrequire_relativeを使っていません。そのため、require_relativeを多用すると、本書を読み進める上では別の予期せぬ問題を引き起こす可能性があります。

解決策2(筆者のお勧め)

筆者としては「できる限り本書と同じコードを書いてもらうのが、予期せぬトラブルを避ける最善の方法」だと考えているので、「正しいカレントディレクトリに移動してrubyコマンドを実行する」がお勧めの解決策になります。

つまり、カレントディレクトリがtestディレクトリになっているのであれば、cd ..コマンドを実行して、ひとつ上のディレクトリに移動してください。それからテストコードを実行すればエラーなく実行できるはずです。

# カレントディレクトリが"test"ディレクトリになっている
$ pwd
/Users/jnito/dev/private/ruby-book-codes/ruby-book/test

# ひとつ上のディレクトリへ移動
$ cd ..

# ここが正しいカレントディレクトリ
$ pwd
/Users/jnito/dev/private/ruby-book-codes/ruby-book

# 念のため、"lib"ディレクトリや"test"ディレクトリが直下に存在することを確認
$ ls
lib      test

# テストコードを実行する
$ ruby test/rgb_test.rb

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/05/06 11:49

    ご回答ありがとうございます!
    本当に分かりやすいご説明で助かりました!
    カレントディレクトリをきちんと理解できていなかったのでもう一度理解して
    チャレンジしてみます!

    キャンセル

checkベストアンサー

0

カレントディレクトリがどこであるか意識して実行していますか?
require "./lid/rgb"は、カレントディレクトリにあるlibの下のrgb.rbを読みます。

このファイルからの相対パスを書きたければ、require_relativeを使います。

あと、ソースコードを画像で載せるのは止めましょう。見づらい上にコピペできないです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/05/05 13:29

    アドバイスありがとうございます!!
    require_relativeでできました!カレントディレクトリを意識するようにします…!

    キャンセル

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

  • ただいまの回答率 89.07%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る