2016-05-31 61 views
3

我想分割一個字符串並從我的函數返回Vec<String>。它必須是Vec<String>而不是Vec<&str>,因爲我不能返回Vec<&str>,可以嗎?但是,如果我可以,我該怎麼做?分割一個字符串並返回Vec <String>

let var1: Vec<&str> = my_string.split("something").collect(); 
let res = var1.iter().map(|x| x.to_string()); 
// I want to return Vec<String> 

我已經嘗試了不同的版本,但得到error: mismatched types等各種類似的錯誤。有更容易的方法嗎?

+2

你可以請嘗試製作一個[MCVE](http://stackoverflow.com/help/mcve),它能夠重現你的問題嗎?之後您可以使用[Playground](https://play.rust-lang.org/)分享。 –

回答

9

你並不需要創建一箇中間Vec<&str>,剛過映射to_string()和使用collect()

let res: Vec<String> = my_string.split("something").map(|s| s.to_string()).collect(); 
+1

在函數中它更好,因爲函數返回類型意味着你不需要'let res:Vec ='方面。 – Shepmaster

+0

這是一個很好的答案。真的幫助我從這裏+1! – LinuxBill

1

可以映射每個&strString的使用Vec::from_iter收集結果:

use std::iter::FromIterator; 

let res = Vec::from_iter(my_string.split("something").map(String::from)); 

這個問題與this one相反。

請注意collectfrom_iter的形式實現。

+1

我想指出的是,使用'collect()'從迭代器中創建一個集合比直接使用'from_iter()'更習慣,但這當然不是一個硬性規則。另外它看起來像引入專門化'to_string()'也是將'&str'轉換爲'String'的慣用方式,儘管我個人比較喜歡'String :: from'或'.into()'。 –

+0

@VladimirMatveev感謝您的意見。你是對的,['FromIterator'](https://doc.rust-lang.org/stable/std/iter/trait.FromIterator.html)文檔說''from_iter'很少明確地調用,並指向'collect '。但是在某些情況下,比如在一個變量定義中,'from_iter'更具可讀性。當可以推斷'collect'類型時,就像函數返回一樣,'collect'更具可讀性。 – malbarbo