我有两个HashSet<u16>,我想实现a = a U b.如果可能的话,我想使用HashSet::union而不是循环或其他调整.

我try 了以下方法:

use std::collections::HashSet;
let mut a: HashSet<u16> = [1, 2, 3].iter().cloned().collect();
let b: HashSet<u16> = [7, 8, 9].iter().cloned().collect();  

// I can build a union object that contains &u16
let union: HashSet<&u16> = a.union(&b).collect();

// But I can't store the union into a
a = a.union(&b).collect();   //  -> compile error

// of course I can do
for x in &b {
    a.insert(*x);
}
// but I wonder if union could not be used to simply build a union

错误消息如下:

the trait bound 
`std::collections::HashSet<u16>: std::iter::FromIterator<&u16>`
is not satisfied

我怎样才能表演a = a U b

推荐答案

你不想要union——正如你所说,它将创建一个新的HashSet.相反,你可以使用Extend::extend:

use std::collections::HashSet;

fn main() {
    let mut a: HashSet<u16> = [1, 2, 3].iter().copied().collect();
    let b: HashSet<u16> = [1, 3, 7, 8, 9].iter().copied().collect();

    a.extend(&b);

    println!("{:?}", a); // {8, 3, 2, 1, 7, 9}
}

(Playground)

Extend::extend也是implemented for other collections,例如Vec.Vec的结果会有所不同,因为Vec不像Set那样尊重重复项.

Rust相关问答推荐

捕获Rust因C++异常而产生panic

在Rust中,如果Result是Err,运行副作用(如日志(log)记录)的惯用方法是什么

如何使用盒装枚举进行模式匹配?

如何点击()迭代器?

如何在Rust中将选项<;选项<;字符串>;转换为选项<;选项&;str>;?

如何在函数中返回自定义字符串引用?

在Rust中声明和定义一个 struct 体有什么区别

为什么比较Option<;字符串>;具有常数Option<&;str>;需要显式类型转换吗?

期望一个具有固定大小 x 元素的数组,找到一个具有 y 元素的数组

处理带有panic 的 Err 时,匹配臂具有不兼容的类型

使用 serde::from_value 反序列化为泛型类型

为什么`tokio::main`可以直接使用而不需要任何导入?

为什么实现特征的对象期望比具体对象有更长的生命周期?

我可以解构self 参数吗?

为什么 js_sys Promise::new 需要 FnMut?

`use` 和 `crate` 关键字在 Rust 项目中效果不佳

如何判断服务器是否正确接收数据

改变不实现克隆的 dioxus UseState struct

使用 rust-sqlx/tokio 时如何取消长时间运行的查询

如何在宏中的多个参数上编写嵌套循环?