Menu
CoddyTech

停车场

本课属于 Coddy Ruby 学习旅程的“面向对象编程”单元。第 55 课,共 57 课。

challenge icon

挑战

困难

构建一个停车场。Vehicle 用于存储 plate;它的子类定义 size 和 hourly_rate:Motorbike 的大小为 1(小型),每小时收费 1;Car 的大小为 2(中型),收费 3;Van 的大小为 3(大型),收费 5。停车场的常量 SIZES 是 %w[small medium large]。Garage.new(small, medium, large) 接收每种大小的车位数量。park(vehicle) 会把车辆停在一个空闲的同等大小车位;如果没有空位,就停在下一个更大的空位,并返回 parked AB12 in medium 或 full for AB12。leave(plate, hours) 会释放车位并返回 AB12 paid 9(按费率乘以小时数计算,至少按 1 小时计费),或者返回 no vehicle AB12。status 会返回 free: small 1, medium 0, large 2。

提供的代码会读取以 small,medium,large 表示的车位数量,然后读取命令 park car AB12、leave AB12 3 或 status,并打印每条命令的回复。

你的代码要写在 vehicle.rb、motorbike.rb、car.rb、van.rb 和 garage.rb 中。main.rb 包含提供的输入/输出代码,不能修改。

亲手试试

require_relative 'vehicle'
require_relative 'motorbike'
require_relative 'car'
require_relative 'van'
require_relative 'garage'

# 提供的输入输出代码:保持原样。
input = []
while (line = gets)
  input << line.chomp
end
small, medium, large = input[0].split(",").map(&:to_i)
garage = Garage.new(small, medium, large)
kinds = { "bike" => Motorbike, "car" => Car, "van" => Van }
input.drop(1).each do |cmd|
  parts = cmd.split
  case parts[0]
  when "park" then puts garage.park(kinds[parts[1]].new(parts[2]))
  when "leave" then puts garage.leave(parts[1], parts[2].to_i)
  else puts garage.status
  end
end

面向对象编程中的所有课

自己练习: Ruby 在线编译器