Ruby 将实例变量设置为';自我';?
我正在创作康威的生活游戏,有两个类:棋盘和细胞 董事会有权进入手机,但我不太清楚具体如何进入。我不能在单元格的初始化方法下放置Ruby 将实例变量设置为';自我';?,ruby,class,self,Ruby,Class,Self,我正在创作康威的生活游戏,有两个类:棋盘和细胞 董事会有权进入手机,但我不太清楚具体如何进入。我不能在单元格的初始化方法下放置cell.board=self?为什么?举个例子,以下是我认为相关的部分 class Board #omitted variables & methods def create_cell cell = Cell.new cell.board = self end end class Cell
cell.board=self
?为什么?举个例子,以下是我认为相关的部分
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
到底做什么?是的,你可以。您可以为任何内容分配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=
访问器。它与传递任何其他变量没有什么不同。cell.board=self
将单元格的board
变量设置为当前的board对象(即调用create\u cell
方法的board对象)
如果将
cell.board=self
放入cell
的initialize
方法中,则会出现一个错误,即cell
未在该范围内定义。如果将其替换为@board=self
,则会将board
变量设置为当前的cell
对象(即正在创建的对象),而不是一个板
对象。因此,这不是您想要的。您的代码中有一个错误。您应该执行cell=cell.new
而不是cell=Class.new
。
是的,您可以将线路板(self)作为参数传递到单元的构造函数(initialize)中。事实上,这样做更干净、更实用。请查看以下代码:
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
$>b=Board.new
# => #
$>c1=b.创建单元格
# => #
$>c2=b.创建单元
# => #
$>c2.board==c1.board
#=>正确
您可以注意到,要么使用
cell.board=self
,要么使用构造函数
(初始化),正在将当前线路板实例设置到创建的单元中。因此所有这些单元都将指向该线路板。您可能指的是cell.new
,而不是Class.new
。我尝试创建一个新对象b=board.new',并调用c1.create\u cell`方法,但它遇到错误:参数数目错误(0代表1)