2017-09-14 5 views
3

La raquette semble avoir deux mécanismes pour ajouter des informations par type aux structures: generics et properties. Malheureusement, la documentation ne semble pas indiquer quand l'un est préféré à l'autre. Les docs disent:Propriétés de structure vs génériques dans la raquette

Les interfaces génériques fournissent une API de haut niveau au-dessus des propriétés de type de structure.

Mais cela ne semble pas fournir une bonne intuition quand je devrais utiliser l'un sur l'autre. Il semble assez clair que define-generic fournit une interface de niveau beaucoup plus élevé que make-struct-type-property. Mais de nombreux types de structures utilisent uniquement des propriétés, ce qui semble indiquer qu'il existe toujours des cas où l'API de bas niveau est préférée. Donc, la question est de savoir quand utiliser le système de propriétés de la structure mieux que d'utiliser le système générique, ou est-ce que la bibliothèque de propriétés existe seulement comme une relique historique?

Répondre

5

Le système de propriété struct est la stratégie d'implémentation de la bibliothèque d'interface générique, elle n'est donc pas obsolète. Cela, ou quelque chose comme ça, est nécessaire pour faire fonctionner les interfaces génériques. Toutes les utilisations des propriétés de structure n'ont pas non plus de sens en tant qu'interfaces génériques. Cela dit, pour de nombreux cas d'utilisation typiques, la forme define-generic est préférée. Comme le suggère le formulaire #:methods pour les structures, il est utile pour le code organisé de manière orientée objet avec une répartition basée sur l'interface. Des exemples de ceci comprennent des séquences (gen:sequence de data/collection) et des dictionnaires (gen:dict).

Les propriétés de structure en clair dans la base de code Racket sont généralement utilisées lorsque certaines données doivent simplement être stockées dans une struct comme métadonnées ou lorsqu'il n'y a qu'une seule "méthode" et define-generic plus compliqué que "juste mettre une procédure ici". Les exemples comprennent prop:procedure ou prop:evt.