0
点赞
收藏
分享

微信扫一扫

d如何推导闭包.


import std.stdio;
import std.algorithm;
import std.traits;
import std.range;

void print(R)(R r) {
static assert(isIterable!R);
r.each!writeln;
}

auto construct(R)(R r, ElementType!R delegate(ulong i) fn) {
static assert(isIterable!R && hasAssignableElements!R);
ulong i = 1;
r.each!((ref e) => e = fn(i));
return r;
}

unittest {
int[] i; i.length = 4;
i.construct((ulong i) {return cast(int)(i+i);}).print;//不能重载.
}//错误消息中的`pure nothrow @nogc @safe`从哪来?

为何​​(ulong i) {return cast(int)(i+i);}​​​,按函数传递?​​闭包​​​与​​函数​​​的​​错误消息​​相同

可用​​construct!(int[])​​而不是普通的​​construct​​来完成工作.这是​​dmd​​实现中(​​非常烦人​​的)缺陷.​​sdc​​可搞定.

因为它是​​闭包​​字面,所以会自动​​找出​​最紧密属性.因而是​​函数​​(未用​​环境​​变量),

但所有这些都​​隐式转换​​了,所以并不重要.类型系统允许这样,只是当提及​​R r​​和​​ElementType!R​​时,​​糟糕​​的实现无法推导​​ElementType!R​​并退出.

因此,必须​​实例化​​时告诉​​类型​​.

i.construct!(int[])((ulong i) {return cast(int)(i+i);}).print;
//要求手动加上

我懂了.问题是​​属性​​不匹配.



举报

相关推荐

0 条评论