我正在使用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对象,但我不知道如何使用循环创建唯一的实例变量。
答案 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提出的解决方案。