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`元素,我想知道是什么机制允许它。)