我试图首先将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();

然而,您的方法有许多不必要的内存分配;我们可以做得更好,没有必要创建一个Vecargs()生成一个迭代器,所以让我们直接使用它,然后 Select 有趣的值.

考虑到这一点:

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);
}

应谢普马斯特的要求:表演时间到了!

下面是一个等价的程序,没有易变性或转义字符,分配量尽可能少:

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相关问答推荐

移植带有可变borrow 的C代码-卸载期间错误(nappgui示例)

borrow 和内部IntoIterator

交换引用时的生命周期

一种随机局部搜索算法的基准(分数)

如何将映射反序列化为具有与键匹配的字段的定制 struct 的向量?

如何从ruust中的fig.toml中读取?

在 Rust 中用问号传播错误时对类型转换的困惑?

如何迭代存储在 struct 中的字符串向量而不移动它们?

在没有任何同步的情况下以非原子方式更新由宽松原子操作 Select 的值是否安全?

Option<&T> 如何实现复制

注释闭包参数强调使用高阶排定特征界限

为什么 Rust 的临时值有时有参考性有时没有?

从光标位置旋转精灵

错误:将自定义 proc_macro 与用Rust 的宝贝编写的属性一起使用时,无法在此范围内找到属性

bcrypt 有长度限制吗?

预期的整数,找到 `&{integer}`

预期类型参数,发现不透明类型

为什么基于 clap::Parser 读取的大量数字进行计算比硬编码该数字时慢?

如何异步记忆选项中的 struct 字段

为什么 u64::trailing_zeros() 在无分支工作时生成分支程序集?