Menu
Coddy logo textTech

Tekrar - Otomat

Coddy'nin Ruby Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 21 / 57.

challenge icon

Görev

Orta

UnknownProduct, SoldOut ve NotEnoughCredit hata sınıflarını oluşturun; bunların tümü StandardError alt sınıfı olmalıdır. VendingMachine.new(stock), { "cola" => [150, 2] } biçiminde bir hash alır (fiyat sent cinsindendir, count miktardır). credit okunabilir olmalı, ancak yalnızca private setter aracılığıyla ayarlanabilmelidir. insert(cents) kredi ekler. buy(name), sırasıyla UnknownProduct (no such product: tea), SoldOut (cola is sold out) veya NotEnoughCredit (cola costs 1.50, credit 1.00) hatalarını oluşturur; aksi durumda stoktan bir ürün alır, fiyatı düşer ve adı döndürür. refund krediyi döndürür ve değerini 0 olarak ayarlar. Private bir yardımcı olan money(cents), 1.50 biçimlendirmesini yapar.

Sağlanan kod, stoğu ilk satırdan (cola:150:2,chips:90:1) okur; ardından insert n, buy name veya refund komutlarını işler. credit 2.00, bought cola, refund 0.50 veya hata mesajını yazdırır ve son olarak dışarıdan credit değerini ayarlamayı deneyerek credit is protected yazdırır.

Kodunuz unknown_product.rb, sold_out.rb, not_enough_credit.rb ve vending_machine.rb dosyalarına yazılmalıdır. main.rb, sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.

Kendin dene

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

# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
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

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online Ruby derleyicisi