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 以了解我的意思。
我正在研究 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 以了解我的意思。