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(),因为它通过副作用进行操作并且不返回有用的值。
| 归档时间: |
|
| 查看次数: |
2247 次 |
| 最近记录: |