初始化实例变量数组

时间:2015-02-18 03:03:31

标签: ruby arrays

我正在使用Board class Cell类进行游戏。需要使用每个Cell的唯一实例变量初始化Board类。我可以对它进行硬编码以使其工作,但它似乎不够优雅,并且不允许用户在运行时选择电路板的大小。这就是我所拥有的:

class Board
  def initialize
    @cell_1 = Cell.new(1)
    @cell_2 = Cell.new(2)
    @cell_3 = Cell.new(3)
    @cell_4 = Cell.new(4)
    @cell_5 = Cell.new(5)
    @cell_6 = Cell.new(6)
    @cell_7 = Cell.new(7)
    @cell_8 = Cell.new(8)
    @cell_9 = Cell.new(0)
    @cells = [@cell_1, @cell_2, @cell_3,
              @cell_4, @cell_5, @cell_6,
              @cell_7, @cell_8, @cell_9]
  end
end

我想我可以使用循环来创建一个散列,其中唯一的键名称指向唯一的Cell对象,但我不知道如何使用循环创建唯一的实例变量

2 个答案:

答案 0 :(得分:1)

如果您不需要创建每个实例变量(@cell_1, @cell_2, ...),则可以使用Enumerable#map

@cells = [*1..8, 0].map { |i| Cell.new(i) }

答案 1 :(得分:0)

如果你真的需要按名称引用每个实例变量,你可以这样做。

class Board
   def initialize
     @cells = (1..9).to_a.map { |i| Cell.new(i) }
   end

   def method_missing(method, *args, &block)
     if method =~ /^cell_[1-9][0-9]*$/
       index = method[/\d+/].to_i
       @cells[index-1]
     else
       super
     end
   end
end

通过这种方式你可以打电话:

board = Board.new
board.cell_1 #=> first cell

当然,我使用@falsetru提出的解决方案。