Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String D语言中的字符串拆分_String_Split_D - Fatal编程技术网

String D语言中的字符串拆分

String D语言中的字符串拆分,string,split,d,String,Split,D,我正在学习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 ch

我正在学习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);
但是为什么我必须使用
char[][]
?据我所知,文档中说,
split
返回一个
字符串[]
,我更喜欢它。

使用
split(line.idup)


split
是一个模板函数,返回类型取决于其参数
file.byLine.front
返回一个
char[]
,出于性能原因,该字符也被重用。因此,如果在当前循环迭代后需要零件,则必须执行
dup
idup
,无论您需要什么。

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

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


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

idup
创建数组的不可变副本。所以,如果这很关键,您可以随时强制转换为immutable,如果需要的话。e、 g.:
foreach(line;file.byLine.map!“用std.algorithm中的
map
投射(字符串)a”)
。然而,通常要小心不可变强制转换。除非你真的知道自己在做什么,否则不应该丢弃不可变强制转换。这样做会破坏类型系统,并可能导致意外行为。在本例中,跨循环迭代存储字符串可能会导致它们“更改其值”,因为它们仍然指向使用的
byLine
相同的临时缓冲区。是的,但在一般情况下需要一个。D通常对原始字符串使用切片,因此如果没有idup,您将不会执行任何分配,idup分配。但是,如果需要字符串accross循环迭代,则必须对其进行dup/idup,因为byLine会一次又一次地重用相同的缓冲区。如果您不需要所有拆分的部件,您可能只需要复制所需的部件。e、 g.拆分(行).front.idup如果只需要第一部分。
foreach(string line; lines(file)) { // new string every iteration }

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