2016-10-03 4 views
0

私は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番目の配列要素を検索するにはどうすればよいですか?

答えて

4

また[]=に加えて[]メソッドを定義する必要があります。

class CompositeTask < Task 
    def [](index) 
    @sub_tasks[index] 
    end 
end 
関連する問題