Menu
Coddy logo textTech

Riepilogo - Distributore automatico

Fa parte della sezione Programmazione orientata agli oggetti del percorso Ruby di Coddy. Lezione 21 di 57.

challenge icon

Sfida

Medio

Crea un distributore automatico con le classi di errore UnknownProduct, SoldOut e NotEnoughCredit, tutte sottoclassi di StandardError. VendingMachine.new(stock) accetta un hash { "cola" => [150, 2] } (prezzo in centesimi, quantità). credit è leggibile, ma può essere impostato solo tramite un setter privato. insert(cents) aggiunge credito. buy(name) genera UnknownProduct (no such product: tea), SoldOut (cola is sold out) o NotEnoughCredit (cola costs 1.50, credit 1.00) in quest'ordine; altrimenti preleva un articolo dalle scorte, sottrae il prezzo e restituisce il nome. refund restituisce il credito e lo imposta a 0. Un helper privato money(cents) formatta 1.50.

Il codice fornito legge le scorte dalla prima riga (cola:150:2,chips:90:1), poi i comandi insert n, buy name o refund. Stampa credit 2.00, bought cola, refund 0.50 oppure il messaggio di errore e infine prova a impostare credit dall'esterno, stampando credit is protected.

Il tuo codice va inserito in unknown_product.rb, sold_out.rb, not_enough_credit.rb e vending_machine.rb. main.rb contiene il codice fornito per l'input/output e non può essere modificato.

Provalo tu

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

# Código de entrada/salida proporcionado: mantenlo tal como está
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

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore Ruby online