【发布时间】:2015-03-21 08:20:32
【问题描述】:
我正在阅读 Andrei Alexandrescu 的“The D Programming Language”,其中一句话让我感到困惑。考虑这样的代码(p.138):
T[] find(T)(T[] haystack, T needle) {
while (haystack.length > 0 && haystack[0] != needle) {
haystack = haystack[1 .. $];
}
return haystack;
}
并调用 (p.140):
double[] a = [ 1.0, 2.5, 2.0, 3.4 ];
a = find(a, 2); // Error! ' find(double[], int)' undefined
解释(代码下方的段落):
如果我们足够用力地眯着眼睛,我们确实会看到在这种情况下调用者的意图是拥有
T = double并受益于从int到double的良好隐式转换。但是,在一般情况下,让语言同时尝试组合隐式转换和类型推导是一个冒险的命题,因此 D 不会尝试做所有这些。
我很困惑,因为像 C# 这样的语言试图推断类型——如果它不能做到这一点,用户就会得到错误,但如果它可以,那么它可以工作。 C# 与它一起生活了好几年,我没有听说过这个功能如何毁了某人的一天。
所以我的问题是——在上面的例子中推断类型有什么危险?
我只看到优点,泛型函数容易写,调用也容易。否则,您将不得不在泛型类/函数中引入更多参数,并编写特殊约束来表达允许的转换,只是为了推断类型。
【问题讨论】:
-
以上在
dmd 2.066中似乎运行良好。我猜他们认为这个提议并不像他们想象的那么“冒险”。 -
这个功能是大约一年前在这个 PR 中引入的:github.com/D-Programming-Language/dmd/pull/3353