type-inference - D 中的函数和委托(delegate)文字

标签 type-inference d

阅读有关函数和委托(delegate)文字的 TDPL (5.6.1)

auto f = (int i) {}; 
assert(is(f == function));

我有一个断言失败。这个说法正确吗?

我尝试了以下方法:
int z = 5;
auto f = (int i) { return i < 5; };
auto d = (int i) { return i < z; };
assert(is(typeof(f) == typeof(d)));

断言在那里有效。实际上 f 是一个委托(delegate),而不是一个函数,即使它不需要帧指针来访问局部变量。这是一个错误吗?

还有,我不明白assert(is(f == function));应该管用。

我试过assert(is(f == delegate));但它也失败了。怎么了?

我使用 DMD32 D 编译器 v2.053

更新
auto f = (int i) {};
assert(is(typeof(f) == delegate))

工作正常,虽然没有理由成为代表


auto f = function (int i) {};
assert(is(typeof(f) == void function(int))); // correct
assert(is(typeof(f) == function));           // failed!!!!!

奇迹。 D2 似乎还没有准备好用于生产。

最佳答案

“f”是一个变量。 is 表达式比较 类型 .这应该有效:

assert(is(typeof(f) == delegate));

如果要创建函数而不是委托(delegate),可以使用函数字面量语法:
auto f = function (int i) { ... };
assert(is(typeof(f) == function));    // should be true

如果不使用函数文字语法,则假定文字是委托(delegate)( Expressions, look under "Function Literals" 。这是有道理的,因为 D 不应该根据文字的主体是否需要堆栈帧来更改类型(这将是 super 麻烦). 编辑:TDPL 实际上确实指定编译器将推断一个函数而不是委托(delegate),如果它可以,不管“函数”关键字。这对我来说似乎是个坏主意,所以这可能是已经被删除的东西。

至于为什么 is(f == function) 不起作用,这看起来像是一种回归。

关于type-inference - D 中的函数和委托(delegate)文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6431884/

相关文章:

ios - 未指定数据类型时 Swift 变量为 nil

java - Java 中的泛型方法和类型推断

haskell - GHCi 中的类型推断与手动签名

d - 如何在 D 2.0 中使用 wchar** 初始化 wstring[]

templates - 测试别名是否是 D 2.0 中的模板

java - Scala:使用类型参数信息访问静态 Java 方法

generics - ceylon max{} 的返回类型

d - 结构和元组有什么原则区别?

c++ - C++11 中的惰性

d - 为什么我没有得到声明者的标识符......?