Rust新手求助:将&str迭代器转换为Vec<String>的更简洁或惯用实现方式
优化&str迭代器转Vec的Rust惯用写法
嘿,作为Rust新手能写出这样的代码已经很赞啦!你当前的实现其实已经很合理,但确实有更简洁、更符合Rust惯用风格的写法,而且性能上和你现在的代码完全一致,只是语法更紧凑~
先看你现有的代码:
let contents = fs::read_to_string(config.filename)?; let la : Vec<String> = contents.lines().map( |x| String::from(x) ).collect();
方法1:使用str::to_string方法
&str类型本身就自带to_string()方法,我们可以直接把闭包替换成方法引用,让代码更简洁:
let contents = fs::read_to_string(config.filename)?; let la: Vec<String> = contents.lines().map(str::to_string).collect();
方法2:利用Into trait(最惯用的简洁写法)
因为&str实现了Into<String>这个标准库trait,所以我们可以直接用Into::into来做类型转换,这是Rust中处理类型转换非常惯用的方式:
let contents = fs::read_to_string(config.filename)?; let la: Vec<String> = contents.lines().map(Into::into).collect();
补充说明
这几种写法底层逻辑完全一致——String::from(x)、x.to_string()和Into::into(x)对于&str来说,最终都是调用相同的字符串拷贝逻辑,所以性能没有差异,只是语法风格不同。如果上下文能自动推断出la的类型是Vec<String>,你甚至可以省略: Vec<String>的类型标注,让代码更清爽。
内容的提问来源于stack exchange,提问作者Florian Kusche
相关产品推荐
相关产品推荐

