【发布时间】:2019-11-05 12:27:59
【问题描述】:
我找不到将HashMap 的值收集到文档中的Vec 的方法。我有score_table: HashMap<Id, Score>,我想把所有的Scores 变成all_scores: Vec<Score>。
我很想使用 values 方法 (all_scores = score_table.values()),但它不起作用,因为 values 不是 Vec。
我知道Values 实现了ExactSizeIterator 特征,但我不知道如何将迭代器的所有值收集到一个向量中,而无需手动编写一个 for 循环并将向量中的值一个接一个地推入。
我也尝试过use std::iter::FromIterator;,但以如下内容结束:
all_scores = Vec::from_iter(score_table.values());
expected type `std::vec::Vec<Score>`
found type `std::vec::Vec<&Score>`
感谢Hash map macro refuses to type-check, failing with a misleading (and seemingly buggy) error message?,我改成了:
all_scores = Vec::from_iter(score_table.values().cloned());
它不会对cargo check产生错误。
这是一个好方法吗?
【问题讨论】:
-
如果你想收藏,为什么不用
collect? -
“这是一种好方法吗?” — 关于 Rust(和 C/C++)的一件事是您需要考虑数据的所有权.默认情况下会移动数据,这会更改所有者。如果您不希望所有者更改,则可以传递参考,也可以克隆原始数据。哪种方式“好”取决于您的用例:如果哈希图是数据的所有者,则可能在其他任何地方使用引用(即
Vec<&Score>)。但是,当所讨论的类型很小时,克隆通常是正确的做法。