3

我正在学习 D 并尝试拆分字符串:

   import std.stdio;
   import std.string;

    auto file = File(path, "r"); 
    foreach (line; file.byLine) {
           string[] parts = split(line);

这无法编译:

Error: cannot implicitly convert expression (split(line)) of type char[][] to string[]

这有效:

    auto file = File(path, "r"); 
    foreach (line; file.byLine) {
           char[][] parts = split(line);

但是为什么我必须使用 a char[][]?据我了解文档,它说split返回 a string[],我更喜欢。

4

2 回答 2

5

使用split(line.idup)

split是一个模板函数,返回类型取决于它的参数。file.byLine.front返回 achar[]也出于性能原因而重用。因此,如果您在当前循环迭代之后需要这些部件,则必须执行dupor idup,无论您需要什么。

于 2013-07-25T09:49:09.563 回答
0

您可以使用std.stdio.lines. 根据您键入foreach循环变量的方式,它将为每次迭代分配一个新缓冲区或重用旧缓冲区。这样你就可以保存.dup/ .idup

但是,选择哪种类型取决于您的用例(即您需要数据多长时间)。

foreach(string line; lines(file)) { // new string every iteration }

foreach(char[] line; lines(file)) { // reuse buffer } 

使用ubyte而不是char将禁用utf8验证。

于 2013-08-15T12:21:03.697 回答