我想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
。我怎樣才能做到這一點?
我想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
。我怎樣才能做到這一點?
您需要x
轉換爲String
,你可以在它上面做+
之前,像x.to_string() + "__"
,但是,還有另外一個問題與您的代碼:
這裏的類型v
是Vec<&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()];
另一種方法是使用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__]
如果我想返回一個&str的vec,我是否必須將每個成員再次轉換回&str? – 2014-10-28 23:46:07
如果您在函數中動態分配字符串,則不能返回'Vec <&str>',因爲這是您在此處執行的操作。你需要返回'Vec
的問題是,內存必須由人所擁有。在文字的情況下,它們直接寫入您的二進制文件。但是當你想把這兩個文字加在一起時,這是行不通的。你需要做一些String
來代表實際擁有的結構,然後如果你真的想用一個切片矢量來製作一個矢量。那有意義嗎?
@jgillich,'concat!'只適用於文字,而不是變量。 – Dogbert 2014-10-28 17:46:08
您可能會覺得這很有用:http://chrismorgan.info/blog/rust-fizzbuzz.html – aochagavia 2014-10-30 21:40:30