2016-12-01 2 views
2

Я работаю над главами 8, от POODR. Объединение объектов с композицией. Тем не менее, я не могу показаться, чтобы сделать пример работы:Ошибка булевского аргумента в Ruby

class Bicycle 
    attr_reader :size, :parts 

    def initialize(args = {}) 
    @size = args[:size] 
    @parts = args[:parts] 
    end 

    def spares 
    parts.spares 
    end 
end 

require 'forwardable' 
class Parts 
    extend Forwardable 
    def_delegators :@parts, :size, :each 
    include Enumerable 

    def initialize(parts) 
    @parts = parts 
    end 

    def spares 
    select { |part| part.needs_spare } 
    end 
end 

require 'ostruct' 
module PartsFactory 
    def self.build(config, parts_class = Parts) 
    parts_class.new(
     config.collect do |part_config| 
     create_part(part_config) 
     end 
    ) 
    end 

    def self.create_part(part_config) 
    OpenStruct.new(
     name:  part_config[0], 
     description: part_config[1], 
     needs_spare: part_config.fetch(2, true) 
    ) 
    end 
end 

Когда я использую road_config:

road_config = 
    [['chain',  '10-speed'], 
    ['tire_size', '23'], 
    ['tape_color', 'red']] 

road_bike = 
    Bicycle.new(
    size: 'L', 
    parts: PartsFactory.build(road_config) 
) 

p road_bike.spares.size 

road_bike.spares.size возвращает 3. Это то, что я ожидал. Однако, когда я использую mountain_config:

mountain_config = 
    [['chain',  '10-speed'], 
    ['tire_size', '2.1'], 
    ['front_shock', 'Manitou', false], 
    ['rear_shock', 'Fox']] 

mountain_bike = 
    Bicycle.new(
    size: 'L', 
    parts: PartsFactory.build(mountain_config) 
) 

p mountain_bike.spares.size 

Я ожидал увидеть 4, а не 3. Если удалить false из front_shock, чтобы его значение по умолчанию (true), mountain_bike.spares.size возвращает 4.

Почему falsemountain_bike.spares.size возвращение 3? Что мне не хватает?

ответ

0

Потому что он не нужен запасной - в классе части, вы выбираете те части, которые нуждаются в запасном:

def spares 
    select { |part| part.needs_spare } 
end 

Этот код будет возвращать те части, которые необходимы запасные части (т.е. needs_spare верно) , false в конфигурации для front_shock устанавливает это значение в false. Попробуйте установить для других частей значение needs_spare значение false, чтобы понять, что я имею в виду.

+0

Ничего себе, это было глупо! Большое спасибо. – ogirginc

Смежные вопросы