2016-05-31 24 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