我正在学习来自Design Patterns in 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
方法。主要目的是:编辑@sub_task
数组中的任何特定任务和特定任务的get_time_required
,而不是@sub_task
数组的时间总和。
如何运行get_time_required
的{{1}}第0个元素?
@sub_tasks
我可以编辑第n个元素:
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
但是,当我尝试查找特定的数组元素时,它会返回错误:
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">]>
以下是我的问题:在将{2}元素添加到 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
第n个数组元素?
答案 0 :(得分:4)
您还需要定义[]
方法(除[]=
之外)。
class CompositeTask < Task
def [](index)
@sub_tasks[index]
end
end