Question

Je viens de lire les informations sur cette page , et alors qu'un nouveau? l'opérateur est mentionné, il est tout à fait clair pour moi ce serait son utilisation.
Quelqu'un pourrait-il s'il vous plaît fournir une explication rapide, poster un code snipped de la façon dont cet opérateur serait utilisé et peut-être mentionner un cas d'utilisation
Modifier : c'est vraiment maladroit, je l'ai remarqué que le? opérateur ne mentionne plus dans les notes de version de Don. Toute idée de pourquoi est-ce?

Était-ce utile?

La solution

Il y a deux nouveaux opérateurs "spéciaux" dans ce F #, et la libération (?) (<-). Ils ne sont pas définis, mais ils sont disponibles pour la surcharge, vous pouvez donc les définir vous-même. Le bit spécial est la façon dont ils traitent leur 2ème opérande: ils ont besoin pour être un identificateur F # valide, mais le transmettre à fonctionner qui implémente l'opérateur en tant que chaîne. En d'autres termes:

a?b

est dessucré à:

(?) a "b"

et

a?b <- c

est dessucré à:

 (?<-) a "b" c

pourrait être une définition très simple de ces opérateurs:

let inline (?) (obj: 'a) (propName: string) : 'b =
    let propInfo = typeof<'a>.GetProperty(propName)
    propInfo.GetValue(obj, null) :?> 'b

let inline (?<-) (obj: 'a) (propName: string) (value: 'b) =
    let propInfo = typeof<'a>.GetProperty(propName)
    propInfo.SetValue(obj, value, null)

Notez que puisque le type de retour pour le gettor est générique, vous devrez spécifier au site d'utilisation dans la plupart des cas, i.e.:.

let name = foo?Name : string

si vous pouvez toujours la chaîne d'appel (depuis le premier argument () est aussi générique?) (?):

let len = foo?Name?Length : int

Une autre, plus intéressante, la mise en œuvre est la méthode CallByName réutilisation fournie par VB:

open Microsoft.VisualBasic    

let inline (?) (obj: 'a) (propName: string) : 'b =
    Interaction.CallByName(obj, propName, CallType.Get, null) :?> 'b //'

let inline (?<-) (obj: 'a) (propName: string) (value: 'b) =
    Interaction.CallByName(obj, propName, CallType.Set, [| (value :> obj) |])
    |> ignore

L'avantage de cela est qu'il va gérer les propriétés et les champs correctement, travailler avec des objets COM IDispatch, etc.

Autres conseils

On dirait que le « ? » opérateur concerne le Dynamic Language Runtime (DLR). Autrement dit, vous utilisez quand vous voulez lier à un élément d'objet (méthode, propriété) lors de l'exécution, plutôt qu'au moment de la compilation.

Il est drôle parce que j'espérais que ce serait la façon dont appel dynamique membre travaillerait en C # aussi. Hélas, C # expose cette fonctionnalité via un type "pseudo" ( "dynamique" de IIRC). À mon avis, ce qui rend le code un peu moins clair (parce que vous devez traquer la déclaration variable pour savoir si l'appel est précoce lié ou liaison tardive).

Je ne sais pas la syntaxe exacte, mais si je devais deviner, il remplace ou augmente la « » opérateur (point). Comme dans:

let x = foo?Bar()

ou peut-être:

let x = foo.?Bar()

Il y a un module FSharp.Interop.Dynamic , sur NuGet que met en œuvre l'opérateur dynamique à l'aide du dlr.

let ex1 = ExpandoObject() in
ex1?Test<-"Hi";
ex1?Test |> should equal "Hi";

Il est open source, licence Apache, vous pouvez regarder le la mise en œuvre et comprend test unitaire exemple cas.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top