【问题标题】:Boolean argument error in RubyRuby 中的布尔参数错误
【发布时间】:2023-03-14 12:53:01
【问题描述】:

我正在编写 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。如果我从 front_shock 中删除 false 以使其恢复为默认值 (true),mountain_bike.spares.size 将返回 4。

为什么falsemountain_bike.spares.size 返回3?我错过了什么?

【问题讨论】:

    标签: ruby oop design-patterns composition


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-10
      • 1970-01-01
      • 1970-01-01
      • 2021-02-01
      • 2023-03-22
      • 2019-08-18
      • 2017-03-27
      相关资源
      最近更新 更多