require 와 Dir[File.dirname(__FILE__)~ 의 차이

7426 단어 객체 지향루비
오브젝트 지향의 이해에 고전했기 때문에 그 비망록으로.

다른 파일을 읽을 때 require 그렇게 잘 갔습니다만, 음색을 타고 Dir[File.dirname(__FILE__)〜 를 사용하려고 해도 빠졌으므로 (5시간 정도) 비망록에 써 둡니다.

나의 teratail 에서의 상호 작용 봐 주시면 나의 스킬의 낮음과 서서히 이해해 나가는 길을 알 수 있으므로 좋으면 봐 주세요.
htps : // 놀라운 l. 코 m / 쿠에 s 치온 s / 202510

잘 갔을 때 스쿠쇼



5개의 탭은 모두 같은 계층입니다.
require 로 각 파일을 호출해 main.rb 로 출력. 스쿠쇼 하부의 「종류:Honda」등이 나오면 OK. Paiza.io를 사용하면 쉽게 테스트할 수 있습니다.



잘했을 때 파일 내용



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 를 치면 첫 번째 스쿠쇼처럼 출력됩니다.

막히는 예


require_relative "car" 를 가장 마지막으로 하면 에러 발생.
불러오는 순서를 의식하지 않으면 안 되네요.



같은 계층에 모든 파일이 있는 경우(이중으로 출력된다)


Dir[File.dirname(__FILE__) + '/lib/*.rb'].sort.each {|file| require file }를 사용하는 경우에 main.rb 가 다른 파일과 모두 같은 계층이라면 (lib 폴더를 만들지 않고 첫 번째 스쿠쇼처럼 모두 같은 계층으로 하고 있는 경우),
Dir[File.dirname(__FILE__) + '/lib/*.rb'].sort.each {|file| require file } 가 모든 파일을 읽는다(동계층의 5개의 파일, 1장째의 스쿠쇼 참조)

② 한층 더 main 로 실행할 때, main.rb 를 다시 한번 읽어들여 이중으로 출력된다. ( main.rb 을 두 번 읽고 있습니다)

아래의 스쿠쇼와 같이 같은 계층에 파일을 옮겨 Dir〜 로 읽어들여 실행(터미널이라면 $ ruby main.rb )하면



같은 계층에 파일을 옮겨 Dir〜 로 읽으면 아래의 스쿠쇼와 같이 이중으로 출력됩니다



【해결책】Dir ~ 를 사용하는 경우는 폴더를 만든다



teratail의 교환으로 알 수 있듯이 초절고전했습니다.
결론은 실행 파일 이외 (여기서 main.rb 이외)는 새로운 폴더를 만들어 거기에 저장. 나는 lib 폴더를 만들었습니다.
lib 폴더로 main.rb 이외의 파일을 옮긴 후 $ ruby main.rb 로 제대로 출력되었습니다.
아무튼 결론, 내 지식 부족이었기 때문에 더 공부가 필요합니다.

좋은 웹페이지 즐겨찾기