Ich schreibe ein einfaches Tic Tac Toe-Spiel, in dem ich eine Klasse für den Vorstand, den Spieler, den Computer und das Spiel selbst habe. In meiner Board-Klasse habe ich eine Klassenvariable @board (das ist ein Array) als attr_reader gesetzt, die es nicht erlauben sollte, direkt darauf zu schreiben. Obwohl das Folgende nicht funktioniert (wie vorgesehen)
%Vor%Das Folgende funktioniert, was ich nicht möchte
%Vor%Wie kann ich verhindern, dass die Klassen-Array-Variable @board in geschrieben wird? Aktueller Klassencode unten:
%Vor%Ich habe versucht, das zu googeln, aber ohne Erfolg, aber ich bin ein absoluter Anfänger, daher verwende ich möglicherweise nicht die richtigen Suchbegriffe.
Ich glaube, Sie müssen das Array unveränderlich machen.
Sie können Array # freeze verwenden, um dies zu erreichen.
Ihr Code sollte danach aussehen:
%Vor%Beim Ausführen Ihres ersten Beispiels:
%Vor%Beim Ausführen Ihres zweiten Beispiels:
%Vor% Das Definieren von attr_reader
only, ohne attr_writer
, verhindert nur Zuweisungen an die Variable @board
. Mit anderen Worten, Ihre Klasse Board
stellt keine Schnittstelle zur Verfügung, um die in @board
gespeicherten Daten zu ändern, verhindert aber nichts, um Änderungen am Anfangswert zu verhindern.
Sie könnten freeze
verwenden:
(Sie brauchen auch nicht map
)
Das Einfrieren des Top-Level-Arrays und der verschachtelten Einsen wird das tun, was du beschreibst, aber ich denke, es wird auch dein Spiel kaputt machen, da Modifikationen komplett unmöglich sind.
Ich würde vorschlagen, @board
überhaupt nicht zu veröffentlichen und sie als privat zu betrachten. Sie sollten dann eine Schnittstelle verfügbar machen, um Werte in der Platine festzulegen, und eine Methode bereitstellen, um eine schreibgeschützte Darstellung der Platine zurückzugeben.