Ruby中的布尔参数错误

时间:2016-12-01 17:28:07

标签: ruby oop design-patterns composition

我正在研究POODR的第8章将对象与作文结合。但是,我似乎无法使示例工作:

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?我错过了什么?

1 个答案:

答案 0 :(得分:0)

因为它不需要备件 - 在您的零件类中,您正在选择需要备件的零件:

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

该代码将返回需要备件的部件(即needs_spare为真)。 false配置中的front_shock将此设置为false。尝试设置其他部分' needs_spare值为false,看看我的意思。