Ruby 中的布尔参数错误

Boolean argument error in Ruby

我正在研究 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 returns 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 个。如果我从 front_shock 中删除 false 以使其成为默认值 (true),mountain_bike.spares.size returns 4.

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

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

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

该代码将 return 需要备件的部分(即 needs_spare 为真)。 front_shock 配置中的 false 将其设置为 false。尝试将其他部分的 needs_spare 值设置为 false 以了解我的意思。