Рубин - Сбой / Состояние охраны возвращается ноль
Я пытаюсь улучшить release_bike
метод. Я вошел в irb, и первое условие защиты работает, и release_working_bikes работает, но второе условие защиты продолжает возвращать ноль в irb, даже когда я запускаю тест характеристик и знаю, что доступен только сломанный велосипед.
Что-то не так с тем, как я формулирую свою вторую неудачную строку, или есть недостаток в broken_bikes
?
release_bike
метод должен работать следующим образом; если на док-станции нет велосипедов, то должно быть предупреждение: No bikes available
если на док-станции есть велосипеды, но они ВСЕ сломаны, то должно быть предупреждение: No working bikes available
если есть какие-то рабочие велосипеды, то release_bike
должен выпустить один из рабочих велосипедов.
Ниже приведены два класса, которые участвуют;
require_relative 'bike'
class DockingStation
DEFAULT_CAPACITY = 20
attr_reader :capacity, :bikes
def initialize(capacity = DEFAULT_CAPACITY)
@bikes = []
@capacity = capacity
end
def release_bike
fail 'No bikes available' if empty?
fail 'No working bikes available' unless broken_bikes
release_working_bikes
end
def dock(bike)
fail 'Docking Station Full' if full?
@bikes << bike
end
private
def working_bikes
@bikes.each { |bike| return bike unless bike.broken? }
end
def broken_bikes
not_working = []
not_working << @bikes.each { |bike| return bike if bike.broken? }
not_working.empty?
end
def release_working_bikes
bike = working_bikes
@bikes.delete(bike)
end
def full?
@bikes.count >= @capacity
end
def empty?
@bikes.empty?
end
end
class Bike
attr_accessor :broken
def initialize
@broken = false
end
def working?
@working
end
def report_broken
@broken = true
end
def broken?
@broken
end
end
1 ответ
Как уже отмечалось в комментариях, вы пытаетесь проверить, все ли велосипеды сломаны, так почему бы не назвать свой метод all_bikes_broken?
, Смотрите комментарии в коде.
require_relative 'bike'
class DockingStation
DEFAULT_CAPACITY = 20
attr_reader :capacity, :bikes
def initialize(capacity = DEFAULT_CAPACITY)
@bikes = []
@capacity = capacity
end
def release_bike
fail 'No bikes available' if empty?
fail 'No working bikes available' unless all_bikes_broken?
release_working_bikes
end
def dock(bike)
fail 'Docking Station Full' if full?
@bikes << bike
end
private
def working_bikes
#this will select only bikes which are NOT broken
@bikes.reject{ |bike| bike.broken? }
end
def all_bikes_broken?
#this is shorthand for @bikes.all?{ |bike| bike.broken? }
#it says send :broken? method to each instance of bike.
#.all? returns true only if all instances return true, otherwise false.
@bikes.all?(&:broken?)
end
def release_working_bikes
bike = working_bikes
@bikes.delete(working_bikes.first)
#or you could do .last but order probably doesn't matter here.
end
def full?
@bikes.count >= @capacity
end
def empty?
@bikes.empty?
end
end
class Bike
attr_accessor :broken
def initialize
@broken = false
end
def working?
@working
end
def report_broken
@broken = true
end
def broken?
@broken
end
end