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

时间:2016-08-03 15:17:28

标签: 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)

1 个答案:

答案 0 :(得分:6)

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

它在unwrap_or_else返回的Option上使用nth(1)来获取Option的内容,如果没有,则使用传递的lambda生成值。 / p>

它还显示了Raw String Literals的情况,这是在必须在字符串中嵌入斜杠时使用的一个很棒的功能。