2016-08-03 44 views
2

我想先設置一個String是一些默認,但隨後更新String如果一個命令行參數已被賦予...如何複製或借用自己的Vec中擁有的字符串的引用?

這是我的出發點(不編譯):

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) 

回答

5

在鏽病,創建元素的副本,它應該實現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,這是一個很好的功能,當需要在字符串中嵌入反斜槓時。

+0

非常好,謝謝你回答問題*和*提供進一步改進:thumbsup: –

+1

所有不需要的可變性,分配和轉義字符! [你可以減少一點](https://play.rust-lang.org/?gist=0102bc8d36aa19aeb38eb7c7e190d5db)。^_ ^ – Shepmaster

相關問題