无法在自定义Ruby类中使用[方括号]方法?

时间:2016-10-03 19:05:55

标签: ruby

我正在学习来自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个数组元素?

1 个答案:

答案 0 :(得分:4)

您还需要定义[]方法(除[]=之外)。

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