2016-12-01 6 views
2

私はPOODRの第8章とオブジェクトを結合するに取り組んでいます。Rubyでブール引数エラーが発生しました

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_configを使用する場合

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 

:しかし、私は例の作業を行うように見えることはできませんは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 

私はデフォルト値(true)にそれをできるようにfront_shockからfalseを削除した場合、4、ないを参照してください。3. mountain_bike.spares.sizeリターンを期待した4

なぜfalsemountain_bike.spares.sizeを返します3?私は何が欠けていますか?

答えて

0

それはスペアを必要としないので - あなたのパーツのクラスでは、あなたはスペアを必要とする部品を選択している:

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

このコードは、スペアを必要とする部品を返す(つまりneeds_spareが真である)されます。 config内のfalseは、front_shockをfalseに設定します。他の部分の 'needs_spare'の値をfalseに設定して、意味を確認してください。

+0

うわー、それは愚かでした!どうもありがとうございました。 – ogirginc

関連する問題