variation de KVB (qui ne fait pas tout à fait la même chose car il suppose le test de type réussit) peut être modifié pour produire un motif similaire:
let (|Value|_|) x value =
match box value with
| :? 'T as y when x = y -> Some()
| _ -> None
Cependant, il y a une différence subtile de performance . Le motif actif d'origine se traduit par:
public static FSharpOption<T> |Value|_|<a, T>(a value)
{
object obj = value;
if (!LanguagePrimitives.IntrinsicFunctions.TypeTestGeneric<T>(obj))
{
return null;
}
return FSharpOption<T>.Some((T)((object)obj));
}
qui est, il fait un essai de type et de fonte. Il est l'utilisation (match x with Value "" -> ...
) se traduit par:
FSharpOption<string> fSharpOption = MyModule.|Value|_|<object, string>(obj);
if (fSharpOption != null && string.Equals(fSharpOption.Value, ""))
{
...
}
Plus particulièrement, la valeur retournée dactylographié à partir du modèle est mis en correspondance avec les transformations typiques du compilateur pour les modèles (string.Equals
pour les chaînes).
Le modèle mis à jour se traduit par:
public static FSharpOption<Unit> |Value|_|<T, a>(T x, a value)
{
object obj = value;
if (LanguagePrimitives.IntrinsicFunctions.TypeTestGeneric<T>(obj))
{
T y = (T)((object)obj);
T y3 = y;
if (LanguagePrimitives.HashCompare.GenericEqualityIntrinsic<T>(x, y3))
{
T y2 = (T)((object)obj);
return FSharpOption<Unit>.Some(null);
}
}
return null;
}
qui utilise l'égalité générique et est moins efficace que contre un littéral correspondant. L'utilisation est un peu plus simple puisque l'égalité est cuite dans le modèle:
FSharpOption<Unit> fSharpOption = MyModule.|Value|_|<string, object>("", obj);
if (fSharpOption != null)
{
...
}
De toute façon, cela fonctionne. Mais j'aime mieux l'original.
Cela fonctionne, mais cela ne vous permet pas non plus d'utiliser des modèles imbriqués (parce que le paramètre du modèle actif paramétré est une expression évaluée, plutôt qu'un modèle comparé). –
Droite. C'est la cause première des différentes sémantiques d'égalité, mais vous l'avez dit de façon plus concise. – Daniel