将Array!(Array!T)转换为范围范围

时间:2016-02-18 16:48:35

标签: d

import std.container: Array;
import std.algorithm: map;
import std.range: transposed;
import std.stdio: writeln;
Array!(Array!int) a;
a.insertBack(Array!int(1,2,3));
a.insertBack(Array!int(4,5,6));
writeln(a[].map!((ref a) => a[]).transposed);
  

错误:模板std.range.transposed无法推断出函数   参数类型!()(MapResult!(__ lambda1,RangeT!(Array!(Array!int)))))

我不太确定这里会发生什么,这不应该是一系列范围吗?为什么D不能推断出类型?

如何将Array!(Array!T)转换为范围范围?

1 个答案:

答案 0 :(得分:2)

transposed的模板约束是:

if (isForwardRange!RangeOfRanges &&
    isInputRange!(ElementType!RangeOfRanges) &&
    hasAssignableElements!RangeOfRanges)

我们可以使用pragma(msg)来确定哪些约束失败:

auto m = a[].map!((ref a) => a[]);
pragma(msg, isForwardRange!(typeof(m)));
pragma(msg, isInputRange!(ElementType!(typeof(m))));
pragma(msg, hasAssignableElements!(typeof(m)));

对我来说,它会打印出来:

true
true
false

这意味着该范围没有可分配的元素。

这可能是因为Array的{​​{1}}没有返回左值(在这种情况下opSlice函数也可以返回左值),并且没有办法“取消将“map切片映射到数组中,以支持通过a[]分配到a

作为解决方法,您可以使用Map切片:

Array