数据消失的特殊情况

时间:2019-05-27 02:54:11

标签: 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);          // 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."]

1 个答案:

答案 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方法的正向范围:

https://tour.dlang.org/tour/en/basics/ranges