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?
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.
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.
Um die anderen Antworten zu erweitern und einige Beispiele für den zweiten Teil der Frage zu geben:
%Vor% 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:
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:
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.
Tags und Links racket