2014-10-28 100 views
0

我想STR的矢量地圖上,這樣它再現其它值:創建一個新的&STR

let v = vec!["str1", "str2", "str3", "str4"] 
let res = v.map_in_place(|x| x + "__") // error: binary operation `+` cannot be applied to type `&str` 

注意,我不需要變化x,我需要創建一個&str通過添加一個新的字符串文字到x。我怎樣才能做到這一點?

+0

@jgillich,'concat!'只適用於文字,而不是變量。 – Dogbert 2014-10-28 17:46:08

+0

您可能會覺得這很有用:http://chrismorgan.info/blog/rust-fizzbuzz.html – aochagavia 2014-10-30 21:40:30

回答

3

您需要x轉換爲String,你可以在它上面做+之前,像x.to_string() + "__",但是,還有另外一個問題與您的代碼:

這裏的類型vVec<&str>map_in_place預期的類型導致類型與原始大小(和對齊方式)相同,並且&str的大小與String的大小不同,因此在運行時會失敗 - Demo

有幾種可能的變化,使這項工作:

如果你真的想使用map_in_place,你可以聲明v爲:

let v = vec!["str1".to_string(), "str2".to_string(), "str3".to_string(), "str4".to_string()]; 

Demo

另一種方法是使用into_iter().map(...).collect(),它將在創建新的矢量後立即釋放原始矢量。

fn main() { 
    let v = vec!["str1", "str2", "str3", "str4"]; 
    let res = v.into_iter().map(|x| x.to_string() + "__").collect::<Vec<_>>(); 
    println!("{}", res); 
} 

輸出:

[str1__, str2__, str3__, str4__] 

Demo

+0

如果我想返回一個&str的vec,我是否必須將每個成員再次轉換回&str? – 2014-10-28 23:46:07

+1

如果您在函數中動態分配字符串,則不能返回'Vec <&str>',因爲這是您在此處執行的操作。你需要返回'Vec '。 '&str'指向其他地方存在的字符串,編譯器必須知道它來自哪裏以及誰負責釋放它。 (在字符串文字的情況下,沒有人負責釋放它們,因爲它們是靜態分配在可執行文件中的,因此是''static'。)'String'的意思是「我擁有一個動態分配的字符串」,所以它負責釋放字符串的內容。 – 2014-10-29 02:02:34

2

的問題是,內存必須由人所擁有。在文字的情況下,它們直接寫入您的二進制文件。但是當你想把這兩個文字加在一起時,這是行不通的。你需要做一些String來代表實際擁有的結構,然後如果你真的想用一個切片矢量來製作一個矢量。那有意義嗎?