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