Рубин - Сбой / Состояние охраны возвращается ноль

Я пытаюсь улучшить 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
Другие вопросы по тегам