2016-10-03 158 views
0

我正在學習Design Patterns in Ruby的複合方法。我遇到以下代碼。無法在自定義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而不是數組中的時間總和。

我該如何運行@sub_tasks的第0個元素get_time_required

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第n個數組元素?

回答

4

您還需要定義一個[]方法(除了[]=之外)。

class CompositeTask < Task 
    def [](index) 
    @sub_tasks[index] 
    end 
end