【问题标题】:Split a string and return Vec<String>拆分字符串并返回 Vec<String>
【发布时间】:2016-05-31 13:31:34
【问题描述】:

我想拆分一个字符串并从我的函数中返回Vec&lt;String&gt;。它必须是Vec&lt;String&gt; 而不是Vec&lt;&amp;str&gt;,因为我不能返回Vec&lt;&amp;str&gt;,可以吗?但是,如果可以的话,我该怎么做呢?

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 和其他类型的类似错误。有没有更简单的方法?

【问题讨论】:

  • 您能否尝试生成一个MCVE 来重现您的问题?之后可以使用Playground分享。
  • 您可以在标签中添加“字符串向量拆分”吗?我找不到你的问题,直到我问自己并被标记出来。

标签: rust


【解决方案1】:

您无需创建中间Vec&lt;&amp;str&gt;,只需映射to_string() 并在此之后使用collect()

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

【讨论】:

  • 在函数中更好,因为函数返回类型意味着您不需要let res: Vec&lt;String&gt; = 方面。
  • 您甚至可以通过将.map(|s| s.to_string()) 替换为map(str::to_string) 来缩短它。
  • 我也将map(ToString::to_string) 视为一种解决方案。我不知道这是否比map(str::to_string)
【解决方案2】:

您可以将每个&amp;str 映射到String 并使用Vec::from_iter 收集结果:

use std::iter::FromIterator;

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

这个问题与this one相反。

请注意,collect 是根据 from_iter 实现的。

【讨论】:

  • 我想指出,使用collect() 从迭代器中创建集合比直接使用from_iter() 更惯用,但这当然不是硬性规定。此外,随着专业化的引入,to_string() 也是将&amp;str 转换为String 的惯用方式,尽管我个人更喜欢String::from.into()
  • @VladimirMatveev 感谢 cmets。你是对的,FromIterator 文档说from_iter 很少被显式调用,并指向collect。但在某些情况下,例如在变量定义中,from_iter 更具可读性。当collect 的类型可以推断出来时,比如在函数返回中,collect 更具可读性。
猜你喜欢
  • 2019-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多