let mut edited_line = "";
使得 edited_line
成为一个带有静态生命周期的 &str
类型。
如果要将 edited_line
变成字符串,可以使用 .to_owned()
方法追加字符串,或者使用 String::new()
创建一个新的字符串:
let mut edited_line = String::new();
let mut edited_line = "".to_owned();
如果您不熟悉Rust的`String`和`str`之间的区别,请参阅此处。
对于您的情况,最重要的是,您无法扩展&str
,但可以扩展String
。
一旦您将edited_line
切换为String
,使用[edited_line,word].join(“,”)
设置edited_line
的方法就可以工作:
for line in reader.lines() {
let split_line = line.unwrap().split(",");
let mut edited_line = String::new();
for word in split_line {
if !word.contains("substring") {
let test_string = [edited_line.as_str(), word].join(",");
edited_line = test_string;
}
}
let _ = writeln!(outfile, "{}", edited_line).expect("Unable to write to file");
}
Playground
然而,这种方法既不高效,也不人性化。而且它的结果是在每一行前加上一个,
,这可能是无意的。
这里有一个替代方案,只使用一个String
实例:
for line in reader.lines() {
let split_line = line.unwrap().split(",");
let mut edited_line = String::new();
for word in split_line {
if !word.contains("substring") {
edited_line.push(',');
edited_line.push_str(word);
}
}
let _ = writeln!(outfile, "{}", edited_line).expect("Unable to write to file");
}
这仍然在每行前加上
,
字符。您可以通过在推送
,
之前检查edited_line是否为空来解决此问题。
Playground
第三个选项是将for循环改为迭代器:
for line in reader.lines() {
let edited_line = line.split(",")
.filter(|word| !word.contains("substring"))
.collect::<Vec<&str>>()
.join(",");
let _ = writeln!(outfile, "{}", edited_line).expect("Unable to write to file");
}
游乐场
这样我们就可以按照预期使用join函数,整洁地消除每行开头的初始,
。
附注:如果您不确定每个变量的类型,建议使用像Intellij-rust这样的IDE,在编写时显示每个变量的类型提示。