有人可以解释下面的代码吗?当我试图理解isNumeric时,我感到很困惑!在这种情况下,T会起作用。
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));
}
答案 0 :(得分:13)
开始于:
auto foo(T)(T n) if (isNumeric!T) {
// ignore this for now
}
foo是一个泛型函数,它接受一个泛型类型的参数。 if (isNumeric!T)
是来自std.traits的编译时检查,它保证foo的类型是数字。非数字类型不起作用。推断它的返回类型,在这种情况下是委托。
此:
(T m) {return m > n;}; //returned from foo
是delegate literal(or closure)。它基本上是一个带状态的函数指针。在这种情况下,它会关闭传递给foo的参数n
。在您的示例中:
auto hoo5 = foo!int(1000);
有效地转换为函数:
bool hoo5 (int x) { return x > 1000; }
因此,当您调用hoo5
时,它会返回一个布尔值,指示其参数是否大于1000 - 但仅限于您的特定情况。
如果你这样打电话给foo:
auto hoo5 = foo!double(1.2345);
您获得对函数的引用,该函数返回一个布尔值,指示其参数(双精度)是否大于1.2345。