2016-12-01 87 views
2

我正在编写POODR的第8章,将组合对象与组合。不过,我似乎无法让这个例子的工作: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,不是如果我从front_shock删除false它让默认值(true),mountain_bike.spares.size返回4

为什么false使mountain_bike.spares.size返回3?我错过了什么?

回答

0

因为它并不需要一个备用 - 在你的零件类,你选择需要备用零件:

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

该代码将返回所需的备用零件(即needs_spare为true) 。配置front_shock中的false将此项设置为false。尝试将其他部分的needs_spare值设置为false以查看我的意思。

+0

哇,那真是愚蠢!非常感谢你。 – ogirginc