Sto scrivendo un semplice gioco Tic Tac Toe, in cui ho una classe per la scheda, il giocatore, il computer e il gioco stesso. Nella mia classe Board, ho impostato una variabile di classe @board (che è un array) come attr_reader, che non consente di scrivere direttamente su di essa. Anche se la seguente non funziona (come previsto)Ruby: non consentire l'aggiornamento di un array che è una variabile di classe
game_board = Board.new
game_board.board = "some junk"
Il seguente funziona, che io non voglio che accada
game_board = Board.new
game_board.board[0] = "some junk"
Come si interrompe il @board variabile array di classe di essere scritta a? codice della classe corrente al di sotto:
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!
ho provato googling questo, ma senza alcun risultato, ma io sono un principiante assoluto, quindi non può utilizzare i termini di ricerca corretti
Ricerca "array immutable" e "freeze array". L'immutabilità deve essere imposta dall'oggetto specifico come 'x.y = a' non ha alcuna relazione o idea sull'assegnazione * * in' x.y.z = b' (eccetto che 'x.y' è stato risolto in precedenza su un oggetto). – user2864740
Nota di terminologia: '@ board' non è una variabile di classe, è una variabile di istanza. Le variabili di classe iniziano con due '@' s, ad es. '@@ board'. –