オブジェクト指向の理解に苦戦したのでその備忘録で。
違うファイルを読み込むときに require
だと上手くいったのですが、調子に乗って Dir[File.dirname(__FILE__)〜
を使おうとしてどハマりしたので(5時間くらい)備忘録に書いておきます。
僕のteratail でのやり取り見ていただくと僕のスキルの低さと徐々に理解していく道のりが分かるのでよかったらご覧ください。
https://teratail.com/questions/202510
上手くいったときのスクショ
5つのタブは全て同階層です。
require で各ファイルを呼び出してmain.rb
で出力。スクショ下部の「種類:Honda」などが出ればOK。Paiza.io を使えば簡単にテストできます。

上手くいったときのファイルの中身
# 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
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
class Ferrari < Car
end
class Honda < Car
end
class Nissan < Car
end
この状況で ターミナルで $ ruby main.rb
と打つと1枚目のスクショのように出力されます。
詰まる例
require_relative "car"
を一番最後にするとエラー発生。
読み込む順番を意識しないとダメですね。

同階層に全てのファイルがある場合(二重に出力される)
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
)すると

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

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