D 数据消失的特殊情况
我正在尝试以下代码:D 数据消失的特殊情况,d,D,我正在尝试以下代码: 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); // p
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: []
在第二次调用中,将打印一个空列表。数据似乎消失了
为什么在第二次通话时数据没有被占用
编辑:即使每次调用transpose,也会打印空列表:
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."]
该范围正在“消耗”。如果您需要像以前一样重用它,则需要确保在使用它之前调用save
$2dqf$1@digitalmars.com
您可以在此处找到有关此的更多信息:
就是这样一种方法
这样做的主要原因是API是如何在D中设计的。并非所有范围都是破坏性迭代的,它只是取决于类型。一般来说,尽管你可以
德朗网站有这样一句话:
标准库中的大多数范围都是结构,因此foreach迭代通常是非破坏性的,尽管不能保证。如果此保证很重要,则可以使用InputRange的专门化-使用.save方法转发范围:
对writeline的调用可能正在使用该范围,之后就什么都没有了。如果您连续两次写入
数据。转置是否合适?否!甚至当我使用'writeln(“transposed data:,data.transposed);`在第二行,将打印一个空列表。范围已被占用。在与之交互之前,您需要调用“save”。如何调用save
?coldata.dup
生成错误。Pl请参见我上面问题中的编辑。我无法进行.dup
或.save
。你能给出一些有效的代码吗?你的意思是transposed
函数只能在数据上使用一次。此外,转置的结果只能使用一次!如果你能简单地提到为什么会有这么多限制,这将是很有用的?(我已经更正了代码中的一条注释)。是的,没错。很抱歉我不太清楚,我会在答案中写更多的内容来澄清这一点。这只是语言的设计,我不是一个D专家,所以我不能评论为什么API是这样设计的。“使用”它的原因是writeln
迭代它来打印它。迭代并使用它Writeln
不使用大多数其他类型的数据。为什么在这里?
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.
}