前提・実現したいこと
独自に作成したクラスがArrayを継承した時に、意図した結果を返すことができません。
PartsクラスがArrayを継承していない場合はBicycleクラスのインスタンスは
Ruby
1#<Bicycle:0x00007fbf3bad3020 @size="L", @parts=#<Parts:0x00007fbf3bad33e0 @parts=[#<Part:0x00007fbf3bad3778 @name="chain", @description="10-speed", @needs_spare=true>, #<Part:0x00007fbf3bad36d8 @name="tire_size", @description="23", @needs_spare=true>, #<Part:0x00007fbf3bad3638 @name="tape_color", @description="red", @needs_spare=true>]>>
上記のように、@partsにPartsクラスのインスタンスの@partsを持つことができるのですが、Arrayを継承すると
Ruby
1#<Bicycle:object_id @size="L", @parts=[]>
のように@partsが空の配列になってしまいます。プリントデバッグをしたところ、
Ruby
1class Parts < Array 2 attr_reader :parts 3 4 def initialize(parts) 5 @parts = parts 6 p parts 7 end 8〜〜〜〜 9end 10#=> [#<Part:0x00007fbf3bad3778 @name="chain", @description="10-speed", @needs_spare=true>, #<Part:0x00007fbf3bad36d8 @name="tire_size", @description="23", @needs_spare=true>, #<Part:0x00007fbf3bad3638 @name="tape_color", @description="red", @needs_spare=true>]
Partsの@partsには、配列に入ったPartクラスのインスタンスがきちんと入っていました。
しかし、Parts.newの戻り値は
Ruby
1Parts.new([chain, mountain_tire, front_shock, rear_shock]) 2#=> []
となってしまいます。
なぜこのような動きになるのでしょうか?
ご回答よろしくお願い致します。
該当のソースコード
Ruby
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 14class Parts < Array 15 attr_reader :parts 16 17 def initialize(parts) 18 @parts = parts 19 p parts 20 end 21 22 def spares 23 parts.select{|part| part.needs_spare} 24 end 25 26 def size 27 parts.size 28 end 29end 30 31class Part 32 attr_reader :name, :description, :needs_spare 33 34 def initialize(args) 35 @name = args[:name] 36 @description = args[:description] 37 @needs_spare = args.fetch(:needs_spare, true) 38 end 39end 40 41 # ------------------------------------------------------------------------------------------ 42 43chain = Part.new(name: 'chain', description: '10-speed') 44road_tire = Part.new(name: 'tire_size', description: '23') 45tape = Part.new(name: 'tape_color', description: 'red') 46mountain_tire = Part.new(name: 'tire_size', description: '2.1') 47rear_shock = Part.new(name: 'rear_shock', description: 'Fox') 48front_shock = Part.new( 49 name: 'front_shock', 50 description: 'Manitou', 51 needs_spare: false 52) 53 54road_bike = Bicycle.new( 55 size: 'L', 56 parts: Parts.new([chain, road_tire, tape]) 57) 58#=> #<Bicycle:object_id @size="L", @parts=[]> 59 60Parts.new([chain, mountain_tire, front_shock, rear_shock]) 61#=> []
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/29 05:09