Was ist der Unterschied zwischen einer transparenten und einer vorfabrizierten Struktur?

8

Wie der Titel andeutet, verstehe ich den Unterschied zwischen der Verwendung von #:transparent und der Verwendung von #:prefab beim Definieren einer Struktur nicht. Die Referenz erwähnt, dass prefab eine Art globaler Freigabe beinhaltet.

Was ist der Unterschied zwischen ihnen? In welcher Situation sollte ich eine über der anderen benutzen?

    
croyd 19.08.2015, 14:26
quelle

4 Antworten

8

Um einen Strukturtyp transparent zu machen, verwenden Sie das Schlüsselwort #: transparent nach der Feldnamenfolge:

%Vor%

Eine Instanz eines transparenten Strukturtyps wird wie ein Aufruf an den Konstruktor ausgegeben, sodass die Strukturfeldwerte angezeigt werden. Ein transparenter Strukturtyp ermöglicht auch reflektive Operationen wie struct? und struct-info, die auf ihren Instanzen verwendet werden.

Obwohl ein transparenter Strukturtyp so gedruckt wird, dass sein Inhalt angezeigt wird, kann die gedruckte Form der Struktur nicht in einem Ausdruck verwendet werden, um die Struktur zurückzuerhalten, im Gegensatz zur gedruckten Form einer Zahl, Zeichenkette, eines Symbols oder einer Liste.

Ein vorfabrizierter Strukturtyp ("fabriziert") ist ein eingebauter Typ, der dem Racket-Drucker und dem Expression-Reader bekannt ist. Unendlich viele solcher Typen existieren und sie werden durch Namen, Feldzählung, Obertyp und andere solche Details indiziert. Das gedruckte Formular einer vorfabrizierten Struktur ähnelt einem Vektor, aber es startet #s statt nur #, und das erste Element in der gedruckten Form ist der Name des vorgefertigten Strukturtyps.

Zu guter Letzt denke ich, dass Sie #: transparent die meiste Zeit über #: prefab verwenden müssen, basierend auf meiner Erfahrung verwende ich normalerweise #: transparent.

    
L.Zaki 19.08.2015, 14:35
quelle
6

Der Schlägerführer hat wahrscheinlich eine sanftere Einführung in vorgefertigte Strukturen.

Der größte Unterschied besteht darin, dass eine transparente Struktur immer noch den Strukturkonstruktor benötigt, um einen von ihnen zu erstellen.

Zum Beispiel mit der folgenden Strukturdefinition:

%Vor%

Im Folgenden finden Sie zwei Möglichkeiten zum Erstellen der exakt gleichen Struktur.

%Vor%

Dies bedeutet, dass jedes Racket-Modul eine% prefab-Struktur foo erstellen kann, auch ohne dass es zuerst definiert wird. Dies macht es sehr nützlich, wenn Sie es in ein Makro einfügen oder es an eine separate Instanz von Racket auf einem anderen Computer senden möchten.

Im Allgemeinen würde ich empfehlen, mit #:transparent structs zu gehen, es sei denn, Sie benötigen die volle Leistung von #:prefab struct.

    
Leif Andersen 19.08.2015 14:33
quelle
6

Um die anderen Antworten zu erweitern und einige Beispiele für den zweiten Teil der Frage zu geben:

%Vor%
  • Verwenden Sie undurchsichtige Strukturen, wenn Sie die Strukturabstraktion ohne Ausnahmen erzwingen wollen, d. h. die Struktur kann nur mit den Zugriffsmethoden erstellt und überprüft werden.
  • Verwenden Sie transparente Strukturen, um den Zugriff auf den Drucker zu ermöglichen und gleich?.
  • Verwenden Sie vordefinierte Strukturen, wenn Sie eine Serialisierung durchführen möchten, z. beim Schreiben und Lesen von der Festplatte.
stchang 19.08.2015 17:23
quelle
3

Ein weiteres wichtiges Detail, das noch nicht erwähnt wurde: Transparente (und normale) Strukturen sind generativ . Das bedeutet, wenn Sie dieselbe Struktur zweimal definieren, sind Werte, die mit der ersten Instanz der Strukturdefinition erstellt wurden, nicht equal? für Werte, die mit der zweiten Definition erstellt wurden. Sie können dies in einer REPL-Sitzung selbst sehen:

%Vor%

Trotz der gleichen Definition und des gleichen Inhalts sind die beiden Instanzen nicht equal? . Obwohl die Strukturen transparent sind, werden sie aus dem Grund, warum Leif Anderson darauf hingewiesen hat, als separate Definitionen betrachtet. Die Verwendung von #: transparent erfordert jedoch nur, dass die Struktur mit dem Konstruktor, den die Struktur definiert, erstellt wird. Zwei Definitionen bedeuten zwei verschiedene Konstruktoren.

Bei prefab -Strukturen geht diese Einschränkung jedoch verloren - Sie können selbst vorfabrizierte Strukturen erstellen, indem Sie einfach die Leserform wie #s(posn 0 0) schreiben. Es gibt keinen Grund mehr, alle Instanzen der Struktur mit ihrem definierten Konstruktor zu erstellen, und daher gibt es keinen Grund, warum sich zwei verschiedene, aber identische Strukturdefinitionen nicht gegenseitig erkennen würden:

%Vor%

Ich bin der Meinung, dass Strukturen, die nur einige zusammengefasste Rohdaten darstellen, vorgefertigt sein sollten, um eine freie, einfache und sichere Serialisierung zu erhalten, Strukturen, die Beschränkungen haben, wie sie konstruiert werden können, sollten transparent sein und Strukturen, die kapseln sollten Einige Verhaltensweisen und Informationen sollten weder transparent noch vordefiniert sein. Dies sind nur Richtlinien, aber Ihre Laufleistung kann variieren.

    
Jack 21.08.2015 09:20
quelle

Tags und Links