我试图首先将String
设置为默认值,但如果已经给出命令行参数,则更新String
...
这是我的起点(不编译):
use std::env;
fn main() {
let mut config_file = "C:\\temp\\rust\\config.txt".to_string();
let args: Vec<String> = env::args().collect();
if args.len() > 1 {
config_file = args[1];
}
println!("Config file path: {}", config_file);
}
所以,(我认为)env::args()
给了我一个拥有的矢量或拥有的字符串......我该怎么做:
注意:
$ rustc --version
rustc 1.8.0 (db2939409 2016-04-11)
答案 0 :(得分:6)
在Rust中,要创建元素的副本,它应该实现Clone
特征,因此具有.clone()
方法。
String
实现Clone
,因此:
config_file = args[1].clone();
但是,您的方法有许多不必要的内存分配;我们可以做得更好,没有必要创建一个Vec
,args()
产生一个迭代器,所以让我们直接使用它,并选择有趣的值。
考虑到这一点:
fn main() {
let mut config_file = "C:\\temp\\rust\\config.txt".to_string();
if let Some(v) = env::args().nth(1) {
config_file = v;
}
println!("Config file path: {}", config_file);
}
在Shepmaster的要求下:这是表演时间!
以下是一个等效的程序,没有可变性或转义字符,并且分配尽可能少:
fn main() {
let config_file = env::args()
.nth(1)
.unwrap_or_else(|| r#"C:\temp\rust\config.txt"#.to_string());
println!("Config file path: {}", config_file);
}
它在unwrap_or_else
返回的Option
上使用nth(1)
来获取Option
的内容,如果没有,则使用传递的lambda生成值。 / p>
它还显示了Raw String Literals的情况,这是在必须在字符串中嵌入斜杠时使用的一个很棒的功能。