Je pense que l'utilisation principale pour l'attribut AutoOpen
est quand vous voulez rendre certaines valeurs let-bound disponibles lorsque l'utilisateur de votre bibliothèque ouvre un espace de noms. C'est là que l'attribut est très utile, car je pense que les bibliothèques devraient généralement exporter toutes les définitions dans namespaces, mais pour certaines raisons, vous devez exporter valeurs et les valeurs ne peuvent pas être définies dans un espace de noms.
Voici un exemple de F# async extensions qui définit un constructeur de calcul et donc il a besoin d'exporter asyncSeq
valeur (mais en même temps, toutes les fonctionnalités est enveloppé dans un espace de noms):
namespace FSharp.Async
type AsyncSeq<'T> = (* ... *)
type AsyncSeqBuilder() = (* ... *)
[<AutoOpen>]
module GlobalValues =
let asyncSeq = AsyncSeqBuilder()
L'utilisateur du bibliothèque peut simplement écrire open FSharp.Async
et ils verront asyncSeq
. Je pense que le même modèle est utilisé avec différentes bibliothèques mathématiques (où vous voulez également exporter des fonctions simples nommées.)
Pour les modules (par exemple List
et Seq
), je pense que la plupart des gens ne pas utiliser open
et accéder aux fonctionne via un nom de module (tel que List.map
), donc bien que vous puissiez l'utiliser pour des modules imbriqués, je n'ai pas vu cela aussi souvent.
Votre utilisation de valeurs montre clairement comment l'utiliser. thks – nicolas