【问题标题】:How do I extend a HashSet<String> with another HashSet<String>?如何用另一个 HashSet<String> 扩展 HashSet<String>? [复制]
【发布时间】:2021-05-22 19:54:47
【问题描述】:

当我尝试用另一个 HashSet&lt;String&gt; 扩展 HashSet&lt;String&gt; 时:

use std::collections::HashSet;
let mut a = HashSet::new();
a.insert("foo".to_owned());
let mut b = HashSet::new();
b.insert("bar".to_owned());
let c = a.extend(&b);

我明白了:

error[E0271]: type mismatch resolving `<&HashSet<String> as IntoIterator>::Item == String`
 --> src/main.rs:7:11
  |
7 | let c = a.extend(&b);
  |           ^^^^^^ expected reference, found struct `String`
  |
  = note: expected reference `&String`
                found struct `String`

我该怎么做?

【问题讨论】:

  • 对另一个问题的接受答案并没有解决这里的问题,因为它建议a.extend(&amp;b) 对OP 失败。它适用于另一个答案,因为另一个答案使用 Copy 的集合元素。 (我有点惊讶a.extend(&amp;b) works for Copy 元素,我想知道什么机制允许它。)

标签: string rust hashset ownership


【解决方案1】:

HashSet::extend() 来自 Extend 特征,因此接受任何迭代器(或可迭代),而不仅仅是一个集合。

如果你将一个集合的引用传递给它,该引用是可迭代的,但迭代器会产生对集合元素的引用——在本例中为&amp;String。由于HashSet::&lt;String&gt;::extend() 需要一个生成实际字符串的迭代器,因此无法编译。有两种方法可以解决此问题:

  • 通过将集合b 传递给extend 按值a.extend(b);
  • 通过使用b.iter()b 创建显式迭代器并克隆它产生的值:a.extend(b.iter().cloned())

在第一个变体中,b 将被消耗,因此调用者不再可以使用,但来自它的字符串将在 a 中重复使用。在第二个变体中,b 将保持可用,但其字符串将被复制以存储在 a 中。

请注意,在这两种变体中,捕获extend() 的返回值都没有意义,因为它通过副作用操作并且不会返回有用的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    • 2018-10-31
    • 1970-01-01
    • 2021-07-14
    相关资源
    最近更新 更多