我尝试先将 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)
最佳答案
在 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);
}
它在 nth(1)
返回的 Option
上使用 unwrap_or_else
来获取 Option
的内容> 或者,如果没有,则使用传递的 lambda 生成一个值。
它还显示了 Raw String Literals 的案例,这是在必须在字符串中嵌入反斜杠时使用的一个很棒的功能。
关于rust - 如何在拥有的 Vec 中复制或借用对拥有的 String 的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38747562/