将实例变量设置为' self'?

时间:2014-03-08 02:05:29

标签: ruby class self

我正在通过两个课程创建康威的生命游戏: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到底做了什么?

3 个答案:

答案 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=访问者。它与传递任何其他变量没什么不同。