オブジェクト指向設計実践ガイド
Rubyでわかる進化し続ける柔軟なアプリケーションでの育て方を参考に学習しております。
第8章 コンポジションでオブジェクトを組み合わせる
8.4コンポーズされたBicycleのサンプルソースを実際に
自分のローカル端末上で動かしたところ下記エラーが発生しました。
PartsFactory.buildの引数はconfig, parts_class = Parts
と2つ存在するためそもそも動かないのではないのではないか?
と考えており、書籍を見直したりエラーコードで検索をしておりますが、
解決できておりません
お力を貸して頂けると助かります。宜しくお願い致します。
Traceback (most recent call last): 1: from bicycle.rb:65:in `<main>' bicycle.rb:32:in `build': uninitialized constant PartsFactory::Parts (NameError)
該当のソースコード
bycycle.rb
1class Bicycle 2 attr_reader :size, :parts 3 4 def initialize(args={}) 5 @size = args[:size] 6 @parts = args[:parts] 7 end 8 9 def spares 10 parts.spares 11 end 12end 13 14require 'forwardable' 15class Part 16 extend Forwardable 17 def_delegators :@parts, :size, :each 18 19 include Enumerable 20 21 def initialize(parts) 22 @parts = parts 23 end 24 25 def spares 26 select { |part| part.needs_spare } 27 end 28end 29 30require 'ostruct' 31module PartsFactory 32 def self.build(config, parts_class = Parts) 33 parts_class.new( 34 config.collect { |part_config| 35 create_part(part_config) 36 } 37 ) 38 end 39 40 def self.create_part(part_config) 41 OpenStruct.new( 42 name: part_config[0], 43 description: part_config[1], 44 needs_spare: part_config.fetch(2, true) 45 ) 46 end 47end 48 49road_config = [ 50 ['chain', '10-speed'], 51 ['tire_size', '23'], 52 ['tape_color', 'red'] 53 ] 54 55mountain_config = [ 56 ['chain', '10-speed'], 57 ['tire_size', '2.1'], 58 ['front_shock', 'Manitou', false], 59 ['rear_sshock', 'Fox'] 60 ] 61 62road_bike = 63 Bicycle.new( 64 size: 'L', 65 parts: PartsFactory.build(road_config) 66 )
バージョン情報
Rubyバージョン:ruby 2.6.5p114 (2019-10-01 revision 67812) [x86_64-darwin18]
回答1件
あなたの回答
tips
プレビュー