Help us understand the problem. What is going on with this article?

require とDir[File.dirname(__FILE__)〜 の違い

More than 1 year has passed since last update.

オブジェクト指向の理解に苦戦したのでその備忘録で。

違うファイルを読み込むときに require だと上手くいったのですが、調子に乗って Dir[File.dirname(__FILE__)〜 を使おうとしてどハマりしたので(5時間くらい)備忘録に書いておきます。

僕のteratail でのやり取り見ていただくと僕のスキルの低さと徐々に理解していく道のりが分かるのでよかったらご覧ください。
https://teratail.com/questions/202510

上手くいったときのスクショ

5つのタブは全て同階層です。
require で各ファイルを呼び出してmain.rb で出力。スクショ下部の「種類:Honda」などが出ればOK。Paiza.io を使えば簡単にテストできます。

スクリーンショット 2019-07-26 16.05.17.png

上手くいったときのファイルの中身

main.rb
# main.rb
require_relative "car" #上から順番に読み込む
require_relative "ferrari"
require_relative "honda"
require_relative "nissan"

def main

cars = [] # cars にデータを追加
  cars << Honda.new("Honda",8, 100, 10) # << は追加するという意味
  cars << Nissan.new("Nissan",5, 50, 10)
  cars << Ferrari.new("Ferrari",2, 2_000, 100)

  cars.each do |car| # car の情報を全て表示
    puts car
  end
end

main # 出力

car.rb
# car.rb
class Car
  def initialize(type,capacity, price, speed) # この4つは具体例を記入するから initialize
    @type = type
    @capacity = capacity
    @price = price
    @speed = speed
  end

  def accel
    "アクセル"
  end

  def brake
    "ブレーキ"
  end

  def to_s
    " 種類:#{@type}、定員:#{@capacity}人、価格:#{@price}万円、加速:#{@speed}km、装備:#{accel}#{brake} "
  end
end
ferrari.rb
class Ferrari < Car
end
honda.rb
class Honda < Car
end
nissan.rb
class Nissan < Car
end

この状況で ターミナルで $ ruby main.rb と打つと1枚目のスクショのように出力されます。

詰まる例

require_relative "car" を一番最後にするとエラー発生。
読み込む順番を意識しないとダメですね。

スクリーンショット 2019-07-26 16.14.38.png

同階層に全てのファイルがある場合(二重に出力される)

Dir[File.dirname(__FILE__) + '/lib/*.rb'].sort.each {|file| require file }
を使う場合にmain.rb が他のファイルと全て同階層だと(libフォルダを作らずに1枚目のスクショのように全て同階層にしてる場合)、
Dir[File.dirname(__FILE__) + '/lib/*.rb'].sort.each {|file| require file } が全てのファイルを読み込む(同階層の5つのファイル、1枚目のスクショ参照)

② さらに main で実行するとき、main.rb をもう一度読み込むから二重で出力される。(main.rb を2度読み込んでいてる)

下のスクショのように同じ階層にファイルを移してDir〜 で読み込んで実行(ターミナルなら $ ruby main.rb)すると

スクリーンショット 2019-07-26 16.47.11.png

同じ階層にファイルを移して Dir〜 で読み込むと下のスクショのように二重に出力されます

スクリーンショット 2019-07-26 16.49.18.png

【解決策】Dir〜 を使う場合はフォルダを作る

teratailのやり取りで分かるように超絶苦戦しました。
結論は、実行ファイル以外(ここでいう main.rb 以外)は新しいフォルダ作ってそこに格納。僕は libフォルダを作りました。
libフォルダにmain.rb以外のファイルを移してから $ ruby main.rb でちゃんと出力されました。
まぁ結論、僕の知識不足ってことでしたのでもっと勉強が必要です。

スクリーンショット 2019-07-26 16.30.28.png

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away