rust - 如何在拥有的 Vec 中复制或借用对拥有的 String 的引用?

标签 rust

我尝试先将 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() 会生成一个迭代器,所以让我们直接使用它并挑选有趣的值。

考虑到这一点:

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/

相关文章:

rust - 在 From 实现中 panic 是惯用的吗?

rust - Rust str 和 ffi::CString 之间的转换以及再次转换会部分损坏字符串

rust - 如何在将字段移动到新变体时更改枚举变体?

rust - Rust 如何理解仅使用 FromIterator::from_iter 来调用 from_iter 的适当实现?

rust - 如何使用 no_std 且没有分配器将输出格式化为字节数组?

multithreading - 如何设计Mutex的可变集合?

multithreading - 为什么 Rust 互斥锁似乎没有给最后想要锁定它的线程锁?

generics - "no field on type"泛型类型实现错误

javascript - 如何在 JS 文件中使用导出的结构?

types - 有没有办法创建只接受一系列值的数据类型?