Ruby: Das Aktualisieren eines Arrays, das eine Klassenvariable ist, nicht zulassen

8

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.

    
AlexManning 30.04.2016, 21:31
quelle

2 Antworten

7

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%     
Alfie 30.04.2016 21:45
quelle
6

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:

%Vor%

(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.

%Vor%     
tompave 30.04.2016 21:51
quelle

Tags und Links