【发布时间】:2016-08-25 22:08:47
【问题描述】:
我正在编写一个简单的井字游戏,其中我有一个关于棋盘、玩家、计算机和游戏本身的类。在我的 Board 类中,我将类变量 @board(它是一个数组)设置为 attr_reader,这应该不允许直接写入它。尽管以下内容不起作用(按预期)
game_board = Board.new
game_board.board = "some junk"
以下确实有效,我不想发生这种情况
game_board = Board.new
game_board.board[0] = "some junk"
如何阻止类数组变量@board 被写入?当前类代码如下:
class Board
attr_reader :board
def initialize
create_board
end
private
def create_board
@board = Array.new(3).map{Array.new(3)}
end
end
game_board = Board.new
game_board.board
#=> [[nil,nil,nil],[nil,nil,nil],[nil,nil,nil]]
game_board.board = "junk"
#=> undefined method 'board ='
game_board.board[0] = "junk"
game_board.board
#=> ["junk",[nil,nil,nil],[nil,nil,nil]] #I don't want to allow this!
我尝试在谷歌上搜索,但无济于事,但我是一个完整的初学者,所以我可能没有使用正确的搜索词
【问题讨论】:
-
搜索“不可变数组”和“冻结数组”。不变性必须由特定对象强加,因为
x.y = a与x.y.z = b中的 assignment 没有任何关系或想法(除了x.y之前已解析为一个对象)。 -
术语说明:
@board不是类变量,而是实例变量。类变量以两个@s 开头,例如@@board.