Рубин - Сбой / Состояние охраны возвращается ноль - PullRequest
0 голосов
/ 21 декабря 2018

Я пытаюсь улучшить метод release_bike.Я вошел в irb, и первое условие защиты работает, и release_working_bikes работает, но второе условие защиты продолжает возвращать ноль в irb, даже когда я запускаю тест характеристик и знаю, что доступен только сломанный велосипед.

Что-то не так с тем, как я формулирую свою вторую строку с ошибкой, или есть ошибка в broken_bikes?

Метод release_bike должен работать следующим образом;если на док-станции нет велосипедов, то должно быть предупреждение: No bikes available если на док-станции есть велосипеды, но они ALL сломаны, то должно быть предупреждение: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 Ответ

0 голосов
/ 22 декабря 2018

Как уже отмечалось в комментариях, вы пытаетесь проверить, не сломаны ли все велосипеды, так почему бы не назвать свой метод 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
...