私はDesign Patterns in RubyからCompositeメソッドを学習しています。私は次のコードを見つけました。カスタムRubyクラスで[角括弧]メソッドを使用できませんか?
目的はベースを持つことです。Task
;この場合、その仕事は時間を追跡することです、それはそれです。具体的な作業はいくつかあります。たとえば、ケーキ成分を混ぜるのにどれくらいの時間がかかるかを把握しているMixTask
です。最後にCompositeTask
は@sub_tasks
にタスクの配列を作成し、タスクを追跡(追加/削除/編集)します。
class CompositeTask < Task
def initialize(name)
super(name)
@sub_tasks = []
end
def remove_sub_task(task)
@sub_tasks.delete(task)
end
def <<(task)
@sub_tasks << task
end
def []=(index, new_value)
@sub_tasks[index] = new_value
end
def get_time_required
time = 0.0
@sub_tasks.each {|task| time += task.get_time_required}
time
end
end
class Task
attr_reader :name
def initialize(name)
@name = name
end
def get_time_required
0.0
end
end
class MixTask < Task
def initialize
super("Mix that batter up!")
end
def get_time_required
3.0
end
end
私の質問はCompositeTask
に面白いに見える[]
メソッドを使用する方法についてです。主な目的は、配列内の特定のタスクを編集し、配列からの時間の合計ではなく、特定のタスクのget_time_required
に編集することです。
実行方法get_time_required
は@sub_tasks
の0番目の要素ですか?
taskie = CompositeTask.new("example")
=> #<CompositeTask:0x00563a22e5afa8 @name="example", @sub_tasks=[]>
taskie << MixTask.new
=> [#<MixTask:0x00563a22e5a6e8 @name="Mix that batter up!">]
taskie << MixTask.new
=> [#<MixTask:0x00563a22e5a6e8 @name="Mix that batter up!">, #<MixTask:0x00563a22e59e50 @name="Mix that batter up!">]
taskie.get_time_required #total time required
=> 6.0
私はちょうど罰金n番目の要素を編集することができます。
taskie[1] = AddDryIngredientsTask.new #edits the 2nd array element successfully
=> #<AddDryIngredientsTask:0x00563a22da26d8 @name="Add dry ingredients">
taskie
=> #<CompositeTask:0x00563a22e5afa8 @name="example", @sub_tasks=[#<MixTask:0x00563a22e5a6e8 @name="Mix that batter up!">, #<AddDryIngredientsTask:0x00563a22da26d8 @name="Add dry ingredients">]>
をしかし、私は特定の配列要素のためのルックアップしようとすると、それはエラーを返します。ここでは
taskie[1].get_time_required
undefined method `[]' for #<CompositeTask:0x00563a22e5afa8>
puts(taskie[1].get_time_required)
undefined method `[]' for #<CompositeTask:0x00563a22e5afa8>
taskie[1]
undefined method `[]' for #<CompositeTask:0x00563a22e5afa8>
は私です質問:@sub_tasks
配列に2つの要素を追加した後、get_time_required
番目の配列要素を検索するにはどうすればよいですか?