【发布时间】:2017-07-22 01:17:48
【问题描述】:
我正在阅读Chapter 13 of the Rust book。它说cloneing 字符串的效率低于通过迭代器访问它们(即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"),
};
// [...]
}
}
【问题讨论】:
标签: rust