F#: laissez 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: le let mutable
de liaison, qui semble fonctionner comme des variables dans "la plupart" des langues, et la cellule de référence (créé avec l' ref
fonction) qui nécessite une référence explicite à 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!
- Voir aussi lorgonblog.spaces.live.com/blog/cns!701679AD17B6D310!689.entrée
- Notez qu'en F# version 4, mutable peut être utilisé où vous avez besoin d'un ref. blogs.msdn.com/b/fsharpteam/archive/2014/11/12/...
Vous devez vous connecter pour publier un commentaire.
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
les 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:Une différence notable entre les deux approches est que
let mutable
magasins de la mutable valeur sur la pile (comme une variable mutable en C#), tandis queref
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: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.Plus 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.Comme décrit dans cet article du Blog MSDN dans la section Simplifié l'utilisation de valeurs mutables, vous n'avez plus besoin réf cellules pour les lambdas.
Donc, en général, vous n'avez plus besoin d'eux à tous.
Cet article par Brian pourrait fournir une réponse.
Des mutables sont faciles à utiliser et efficace (sans emballage), mais ne peuvent pas être capturés dans les lambdas. Ref cellules peut être capturé, mais sont prolixes et de moins en moins efficace (? - pas sûr de cette partie).
Vous pouvez prendre un coup d'oeil à la Données Mutable section dans le wikibook.
Pour des raisons de commodité, voici quelques citations: