我正在阅读Rust书籍第13章。它说clone
字符串比通过迭代器(即next()
)访问它们的效率要低。比较以下示例,我有两个问题:
args.next()
会将字符串移动或克隆到query
和filename
中吗?- 如果是移动操作,它会从
env::args()
中的某些内容转移所有权到query
,这不会破坏其他代码吗?如果是克隆操作,为什么比直接克隆字符串更有效率?
定义:
struct Config {
query: String,
filename: String,
}
低效版本
fn main() {
let args: Vec<String> = env::args().collect();
let config = Config::new(&args)
}
impl Config {
fn new(args: &[String]) -> Result<Config, &'static str> {
// [...]
let query = args[1].clone();
let filename = args[2].clone();
// [...]
}
}
更好的版本
fn main() {
let config = Config::new(env::args())
}
impl Config {
fn new(mut args: std::env::Args) -> Result<Config, &'static str> {
args.next();
let query = match args.next() {
Some(arg) => arg,
None => return Err("Didn't get a query string"),
};
let filename = match args.next() {
Some(arg) => arg,
None => return Err("Didn't get a file name"),
};
// [...]
}
}