Quelle est la différence entre les 3 façons de définir la valeur d'une référence dans Clojure? J'ai lu la documentation à plusieurs reprises sur ref-set, commute et alter. Je suis plutôt confus qui utiliser à quel moment. Est-ce que quelqu'un peut me fournir une brève description de ce que sont les différences et pourquoi chacune est nécessaire?
Réponses
Trop de publicités?Comme une super explication simple de la façon dont le Logiciel de la Mémoire Transactionnelle système fonctionne en clojure; il réessaie opérations jusqu'à ce que chacun d'entre eux passe à travers sans avoir ses valeurs changé de titre. Vous pouvez l'aider à prendre cette décision en utilisant ref-changement de fonctions qui lui donnent des indications sur ce que les interactions sont en sécurité entre les transactions.
ref-set
est pour quand vous n'avez pas de soins sur la valeur actuelle. Juste régler ce!ref-set
vous permet d'économiser de l'angoisse de l'écriture quelque chose comme(alter my-ref (fun [_] 4))
juste pour définir la valeur de ma-ref à 4.(ref-set my-ref 4)
vous ne regardez beaucoup mieux :).
Utiliserref-set
de simplement définir la valeur.alter
est la plus normale standard. Utilisez cette fonction pour modifier la valeur. C'est la viande de la STM. Il utilise la fonction que vous passez à changer la valeur et de nouvelles tentatives si elle ne peut pas garantir que la valeur est inchangé depuis le début de la transaction. C'est très fort, même dans certains cas où vous n'avez pas besoin d'être que , comme l'incrémentation d'un compteur. Vous voudrez probablement utiliseralter
la plupart du temps.commute
est une version optimisée de modifier, pour les moments où l'ordre des choses n'a pas vraiment d'importance. il ne fait aucune différence qui ajouté +1 au compteur. Le résultat est le même. Si la STM est de décider si votre transaction est sécuritaire de le commettre et il ne dispose que de conflits de commuer les opérations et aucun sur modifier les opérations, puis il peut aller de l'avant et appliquer les nouvelles valeurs sans avoir à redémarrer n'importe qui. Cela peut économiser de l'opération occasionnelle réessayer si vous n'allez pas voir d' énormes gains de ce code.
Utilisercommute
quand vous le pouvez.
Excellente réponse d'Arthur. Je contribue simplement: http://clojure.org/refs pour référence ultérieure.