在 Rust 中收集拥有所有权的字符串到拥有所有权的向量中

3

我正在尝试使用以下方式在rust中收集字符串到一个字符串向量中:

let fields : ~[~str] = row.split_str(",").collect();

我遇到了以下错误:预期的std :: iter :: FromIterator<&str>,但找到了std :: iter :: FromIterator<~str>(str存储不同:预期&,但找到~
我尝试使用类型提示,但没有成功。

你使用的 Rust 版本是什么? - huon
2
波浪号语法已从语言中删除,被Box替代。如果您不是计算机历史学家,我建议完全跳过这个问题。这个问题类似但更新:https://dev59.com/zbvpa4cB1Zd3GeqPBvNN - David Lotts
1个回答

10

.split_str 方法返回一个 迭代器,用于遍历 &str 切片,也就是说,它会返回 row 数据的子视图。这里的借用的 &str 并不是拥有所有权的 ~str:为了让它工作,可以将其收集到一个 ~[&str] 中,或者在收集之前将每个 &str 复制到一个 ~str 中:

let first: ~[&str] = row.split_str(",").collect();
let second: ~[~str] = row.split_str(",").map(|s| s.to_owned()).collect();

如果您希望根据单个字符谓词来分割字符串,那么split会更加高效(例如,在这种情况下使用row.split(',') )。

此外,我建议您升级到较新版本的Rust,0.11版本最近已经发布,但是nightlies是推荐的安装目标(将上面文档链接中的0.10更改为对应文档的0.11master)。

使用nightly版本,以上两个代码示例可以编写为:

let first: Vec<&str> = row.split(',').collect();
let second: Vec<String> = row.split(',').map(|s| s.to_string()).collect();

最后,如果您对 &str 和 ~str(即 String)的区别感到困惑,可以查看我之前写的一篇详细介绍(链接地址:https://dev59.com/OWAf5IYBdhLWcg3w52I_#24159933)。

谢谢!是的,我现在正在升级和更改我的语法。 - rdmcfee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接