2010-12-03 6 views
10

Quelqu'un peut-il expliquer le code ci-dessous? Je suis confus quand j'essaie de comprendre comment fonctionneNumeric! T dans ce cas.Modèle en programmation D

auto foo(T)(T n) if (isNumeric!T) { 
    return (T m) {return m > n;}; 
} 

void main() { 
    auto hoo5 = foo!int(1000); 
    writeln(hoo5(93)); 
    writeln(hoo5(23)); 
} 

Répondre

13

Commencez par:

auto foo(T)(T n) if (isNumeric!T) { 
    // ignore this for now 
} 

foo est une fonction générique qui prend un argument de son type générique. if (isNumeric!T) est un contrôle à la compilation de std.traits qui garantit que le type de foo est numérique. Les types non numériques ne fonctionneront pas. Son type de retour est déduit et dans ce cas est un délégué.

Ce:

(T m) {return m > n;}; //returned from foo 

est un delegate literal (or closure). C'est fondamentalement un pointeur de fonction avec l'état. Dans ce cas, il se ferme sur le paramètre n transmis à foo. Dans votre exemple:

auto hoo5 = foo!int(1000); 

se traduit efficacement à la fonction:

bool hoo5 (int x) { return x > 1000; } 

Ainsi, lorsque vous appelez hoo5, elle renvoie une valeur booléenne indiquant si son argument est supérieur à 1000 - mais seulement dans votre cas .

Si vous appelez foo comme ceci:

auto hoo5 = foo!double(1.2345); 

Vous obtenez une référence à une fonction qui renvoie une valeur booléenne indiquant si son argument (double) est supérieur à 1,2345.

+0

Il y a des fautes de frappe. Je l'ai réparé. Merci! – Nate

+1

Vous expliquez vraiment bien. Je le comprends maintenant. Je vous remercie. – Nate

Questions connexes