我正在通过两个课程创建康威的生命游戏:Board&细胞
Board可以访问Cell,但我不确定具体如何。我不能将cell.board = self
放在Cell的初始化方法下吗?为什么或者为什么不?举例来说,这就是我认为的相关部分。
class Board
#omitted variables & methods
def create_cell
cell = Cell.new
cell.board = self
end
end
class Cell
attr_accessor :board
def initialize
end
end
此外,cell.board = self
到底做了什么?
答案 0 :(得分:2)
您的代码中存在错误。而不是cell = Class.new
你应该做cell = Cell.new
。
是的,您可以将板(self)作为Cell的构造函数中的参数传递(初始化)。事实上,这样更干净,更实用。看看这段代码:
class Board
def create_cell
cell = Cell.new(self)
end
end
class Cell
attr_accessor :board
def initialize board
@board = board
end
end
然后是一些使用示例。
$> b = Board.new
# => #<Board:0x000001021c0298>
$> c1 = b.create_cell
# => #<Cell:0x000001021c27a0 @board=#<Board:0x000001021c0298>>
$> c2 = b.create_cell
# => #<Cell:0x000001021d4270 @board=#<Board:0x000001021c0298>>
$> c2.board == c1.board
# => true
您可以注意到,cell.board = self
或使用constructor
(初始化),将当前电路板实例设置为创建的单元格。因此,所有这些单元格都将指向该板。
答案 1 :(得分:1)
cell.board = self
将单元格的board
变量设置为当前板对象(即您调用create_cell
方法的板对象。
如果您将cell.board = self
放入Cell
的{{1}}方法,则会收到错误,即该范围内未定义initialize
。如果您将其替换为cell
,则会将@board = self
变量设置为当前board
对象(即正在创建的对象),而不是Cell
对象。所以这不是你想要的。
答案 2 :(得分:0)
是的,你可以。您可以将self
分配给任何内容。您无法将其他内容分配给 self
,但将self
分配给任何其他可访问变量或将其传递给方法没有任何问题。
class Board
#omitted variables & methods
def create_cell
cell = Class.new(self)
end
end
class Cell
attr_accessor :board
def initialize(board)
self.board = board
end
end
另外,cell.board = self究竟做了什么?
它只是将变量传递给board=
访问者。它与传递任何其他变量没什么不同。