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)