我正在尝试以下代码:
import std.stdio;
import std.range;
void main(){
auto data = [[1,2,3], [4,5,6]]; // putting auto instead of int[][] here makes no difference;
auto coldata = data.transposed;
writeln("coldata: ", coldata); // prints ok;
writeln("transposed data: ", coldata); // Empty list is printed. Data disappears/evaporates!
}
输出为:
$ rdmd evapor.d
coldata: [[1, 4], [2, 5], [3, 6]]
transposed data: []
在第二个呼叫中,将打印一个空列表。数据似乎消失/消失了!
为什么数据没有在第二次通话时计费?
编辑:即使我每次都调用移调,也会打印空列表:
writeln("coldata: ", data.transposed); // prints ok;
writeln("transposed data: ", data.transposed); // data disappears / evaporates!
此外,使用coldata.dup
不起作用。我产生以下错误:
soq_evapor.d(10): Error: template object.dup cannot deduce function from argument types !()(Transposed!(int[][], cast(TransverseOptions)0)), candidates are:
/usr/include/dmd/druntime/import/object.d(3169): object.dup(T : V[K], K, V)(T aa)
/usr/include/dmd/druntime/import/object.d(3206): object.dup(T : V[K], K, V)(T* aa)
/usr/include/dmd/druntime/import/object.d(4482): object.dup(T)(T[] a) if (!is(const(T) : T))
/usr/include/dmd/druntime/import/object.d(4508): object.dup(T)(const(T)[] a) if (is(const(T) : T))
Failed: ["/usr/bin/dmd", "-v", "-o-", "soq_evapor.d", "-I."]
答案 0 :(得分:1)
该范围正在“消耗”中。如果您需要像以前一样重用它,则需要确保在使用前先调用save
。
https://forum.dlang.org/post/migwtldccpwryusyolkq@forum.dlang.org https://forum.dlang.org/post/n2m1jl $ 2dqf$1@digitalmars.com
您可以在此处找到有关此信息的更多信息:https://forum.dlang.org/thread/plsuntcmsezxpjbxkfnz@forum.dlang.org
import std.stdio;
import std.range;
void main(){
auto data = [[1,2,3], [4,5,6]]; // putting auto instead of int[][] here makes no difference;
auto coldata = data.dup();
auto otherData = data.dup();
writeln("coldata: ", coldata.transposed); // prints ok;
writeln("transposed data: ", otherData.transposed); // this also prints ok.
}
就是这样一种方式。
执行此操作的主要原因是如何在D中设计API。并非所有范围都被破坏性地迭代,这取决于类型。一般来说,虽然可以。
D Lang网站上这样说:
标准库中的大多数范围都是结构,因此foreach迭代通常是非破坏性的,尽管不能保证。如果此保证很重要,则可以使用InputRange的特殊化-使用.save方法的正向范围: