如何使用另一个 HashSet<String> 扩展 HashSet<String>?

Sim*_*gan 6 string hashset ownership rust

当我尝试用HashSet<String>另一个扩展 a 时HashSet<String>

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);
Run Code Online (Sandbox Code Playgroud)

我得到:

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`
Run Code Online (Sandbox Code Playgroud)

我该怎么做呢?

use*_*342 10

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

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

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

在第一个变体中,b将被消耗,因此调用者不再可以使用,但其中的字符串将在a. 在第二个变体中,b将仍然可用,但其字符串将被复制以存储在a.

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