String D语言中的字符串拆分
我正在学习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
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 }