String 如何扩展哈希集<;字符串>;使用另一个哈希集<;字符串>;?

String 如何扩展哈希集<;字符串>;使用另一个哈希集<;字符串>;?,string,rust,hashset,ownership,String,Rust,Hashset,Ownership,当我试图用另一个HashSet扩展一个HashSet时: 使用std::collections::HashSet; 让mut a=HashSet::new(); a、 插入(“foo.to_owned()); 让mut b=HashSet::new(); b、 插入(“bar.”to_owned()); 设c=a.extend(&b); 我得到: 错误[E0271]:类型不匹配解决`::Item==String` -->src/main.rs:7:11 | 7 |设c=a.延伸(&b); |^

当我试图用另一个
HashSet
扩展一个
HashSet
时:

使用std::collections::HashSet;
让mut a=HashSet::new();
a、 插入(“foo.to_owned());
让mut b=HashSet::new();
b、 插入(“bar.”to_owned());
设c=a.extend(&b);
我得到:

错误[E0271]:类型不匹配解决`::Item==String`
-->src/main.rs:7:11
|
7 |设c=a.延伸(&b);
|^^^应为引用,找到结构`String`
|
=注意:应为引用“&字符串”`
找到struct`String`
如何做到这一点?

HashSet::extend()来自trait,因此接受任何迭代器(或iterable),而不仅仅是一个集合

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

  • 通过按值将集合
    b
    传递到
    extend
    a.extend(b)
  • 通过使用
    b.iter()
    b
    创建一个显式迭代器,并克隆它产生的值:
    a.extend(b.iter().cloned())
在第一个变体中,
b
将被使用,因此调用者不再使用,但它的字符串将在
a
中重新使用。在第二个变体中,
b
将保持可用,但其字符串将被复制以存储在
a

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

HashSet::extend()
来自trait,因此接受任何迭代器(或iterable),而不仅仅是一个集合

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

  • 通过按值将集合
    b
    传递到
    extend
    a.extend(b)
  • 通过使用
    b.iter()
    b
    创建一个显式迭代器,并克隆它产生的值:
    a.extend(b.iter().cloned())
在第一个变体中,
b
将被使用,因此调用者不再使用,但它的字符串将在
a
中重新使用。在第二个变体中,
b
将保持可用,但其字符串将被复制以存储在
a


请注意,在任何一种变体中,捕获
extend()
的返回值都没有意义,因为它会产生副作用,并且不会返回有用的值。

对另一个问题的公认答案没有解决此处提出的问题,因为它建议
a.extend(&b)
操作失败。它在另一个答案中起作用,因为另一个答案使用的集合元素是
Copy
。(我有点惊讶于
a.extend(&b)适用于
Copy`elements,我想知道是什么机制允许它。)另一个问题的公认答案没有解决这里所问的问题,因为它建议
a.extend(&b)
操作失败。它在另一个答案中起作用,因为另一个答案使用的集合元素是
Copy
。(我有点惊讶于
a.extend(&b)适用于
Copy`元素,我想知道是什么机制允许它。)