Menu
Coddy logo textTech

복습 - 자판기

Coddy Ruby 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 57개 중 21번째.

challenge icon

챌린지

중급

오류 클래스 UnknownProduct, SoldOut, NotEnoughCredit이 있는 자판기를 만드세요. 이 클래스들은 모두 StandardError의 서브클래스입니다. VendingMachine.new(stock)은 해시 { "cola" => [150, 2] }(가격은 센트 단위, 수량)를 받습니다. credit은 읽을 수 있지만 private setter를 통해서만 설정할 수 있습니다. insert(cents)는 크레딧을 추가합니다. buy(name)은 순서대로 UnknownProduct(no such product: tea), SoldOut(cola is sold out) 또는 NotEnoughCredit(cola costs 1.50, credit 1.00)을 발생시킵니다. 그렇지 않으면 재고에서 상품 하나를 가져오고 가격을 차감한 다음 이름을 반환합니다. refund는 크레딧을 반환하고 크레딧을 0으로 설정합니다. private 헬퍼 money(cents)는 1.50 형식으로 지정합니다.

제공된 코드는 첫 번째 줄에서 재고를 읽고(cola:150:2,chips:90:1), 이어서 insert n, buy name 또는 refund 명령을 읽습니다. credit 2.00, bought cola, refund 0.50 또는 오류 메시지를 출력하고, 마지막으로 외부에서 credit을 설정하려고 시도하여 credit is protected를 출력합니다.

코드는 unknown_product.rb, sold_out.rb, not_enough_credit.rb 및 vending_machine.rb에 작성하세요. main.rb에는 제공된 입력/출력 코드가 들어 있으며 수정할 수 없습니다.

직접 해보기

require_relative 'unknown_product'
require_relative 'sold_out'
require_relative 'not_enough_credit'
require_relative 'vending_machine'

# 제공된 입력/출력 코드: 그대로 유지하세요
input = []
while (line = gets)
  input << line.chomp
end
stock = input[0].split(",").to_h do |entry|
  name, price, count = entry.split(":")
  [name, [price.to_i, count.to_i]]
end
machine = VendingMachine.new(stock)
input.drop(1).each do |line|
  command, arg = line.split
  begin
    case command
    when "insert"
      machine.insert(arg.to_i)
      puts format("credit %.2f", machine.credit / 100.0)
    when "buy"
      puts "bought #{machine.buy(arg)}"
    else
      puts format("refund %.2f", machine.refund / 100.0)
    end
  rescue UnknownProduct, SoldOut, NotEnoughCredit => e
    puts e.message
  end
end
begin
  machine.credit = 500
  puts "credit changed"
rescue NoMethodError
  puts "credit is protected"
end

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 Ruby 컴파일러