87 votes

F #: laisser mutable vs ref

Tout d'abord, je reconnais la possibilité que cette question pourrait être un doublon; laissez-moi savoir.

Je suis curieux de ce que le général "meilleures pratiques" pour les situations où la mutabilité est souhaitée. F# semble offrir deux possibilités pour cela: l' let mutable la liaison, qui semble fonctionner comme des variables dans "la plupart" des langues, et la cellule de référence (créé avec l' ref de la fonction) qui doit être expressément référence à utiliser.

Il y a quelques cas où l'on est "forcé" dans l'un ou de l'autre: .NET interop a tendance à utiliser des mutable avec <-, et dans les calculs de flux de travail, on doit utiliser ref avec :=. Si ces cas sont assez claires, mais je suis curieux de savoir quoi faire lors de la création de mon propre mutable variables en dehors de ces scénarios. Quels sont les avantages d'un style de ont sur les autres? (Peut-être un aperçu plus loin dans la mise en œuvre de l'aide.)

Merci! (Et désolé pour la "surconsommation" de guillemets.)

136voto

Tomas Petricek Points 118959

Je ne peux qu'appuyer ce que gradbot dit - quand j'ai besoin de mutation, je préfère let mutable.

Concernant la mise en œuvre et les différences entre les deux - ref des cellules sont mises en œuvre essentiellement par une très simple enregistrement qui contient une mutable enregistrement de domaine. Vous pouvez les écrire facilement vous-même:

type ref<'T> =  // '
  { mutable value : 'T } // '

// the ref function, ! and := operators look like this:
let (!) (a:ref<_>) = a.value
let (:=) (a:ref<_>) v = a.value <- v
let ref v = { value = v }

Une différence notable entre les deux approches est que l' let mutable des magasins de la mutable valeur sur la pile (comme une variable mutable en C#), tandis que ref des magasins de la mutable valeur dans un champ d'un segment de mémoire allouée dossier. Cela peut avoir une incidence sur les performances, mais je n'ai pas tous les numéros...

Grâce à cela, les valeurs mutables qui utilisent ref peut être un alias - ce qui signifie que vous pouvez créer deux valeurs font référence à la même mutable valeur:

let a = ref 5  // allocates a new record on the heap
let b = a      // b references the same record
b := 10        // modifies the value of 'a' as well!

let mutable a = 5 // mutable value on the stack
let mutable b = a // new mutable value initialized to current value of 'a'
b <- 10           // modifies the value of 'b' only!

19voto

gradbot Points 9219

Liés à la Question: "Vous avez mentionné que les collectivités locales de valeurs mutables ne peut pas être capturé par une fermeture, alors vous devez utiliser la ref à la place. La raison pour cela est que les valeurs mutables capturé dans la fermeture doivent être alloués sur le tas (en raison de la fermeture est alloué sur le tas)." de F# ref-mutable vars vs champs d'objet

Je pense que let mutable est préféré plus de cellules de référence. Personnellement, je utiliser uniquement les cellules de référence lorsqu'ils sont requis.

La plupart des code que j'ai écris ne pas utiliser des variables mutables grâce à la récursivité et la queue des appels. Si j'ai un groupe de données mutable-je utiliser un record. Pour les objets que j'utilise let mutable rendre privé mutable variables. Je n'ai vraiment utiliser les cellules de référence pour les fermetures, généralement des événements.

4voto

Mau Points 6480

Cet article de Brian pourrait fournir une réponse.

Les mutables sont faciles à utiliser et efficaces (sans emballage), mais ne peuvent pas être capturés dans lambdas. Les cellules de référence peuvent être capturées, mais sont verbeuses et moins efficaces (? - pas sûr de cela).

3voto

danlei Points 8602

Vous pouvez prendre un coup d'oeil à la Mutable Données de la section dans le wikibook.

Pour plus de commodité, voici quelques citations:

Le mot-clé mutable est fréquemment utilisé avec les types d'enregistrements pour créer mutable enregistrements

Mutable variables sont un peu limité: des mutables sont inaccessibles en dehors de la portée de la fonction où elles sont définies. Plus précisément, cela signifie que ce n'est pas possible de référence à un mutables dans une sous-fonction d'une autre fonction.

Ref cellules obtenir autour de certains limitations de des mutables. En fait, réf. les cellules sont très simples type de données qui envelopper mutable champ dans un enregistrement type.

Depuis réf cellules sont affectées sur la tas, ils peuvent être partagées à travers de multiples fonctions

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