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.

}