54 votes

ref-set vs commute vs alter

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?

88voto

Arthur Ulfeldt Points 45059

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 :).
    Utiliser ref-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 utiliser alter 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.
    Utiliser commute quand vous le pouvez.

3voto

Alex Miller Points 28225

Excellente réponse d'Arthur. Je contribue simplement: http://clojure.org/refs pour référence ultérieure.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X