我想用伪代码执行以下操作:

(a, b, c) = (HashSet(...), HashSet(...), HashSet(...))

(a, b, c) = (a - b - c, b - a - c, c - a - b)

在《铁 rust 》中,我try 了这样的东西:

fn get_random_set(...) -> HashSet<String> {
    ...
}

// Sets of randomly generated "words" that define behavior of the whole program.
let action_plus: HashSet<String> = get_random_set();
let action_minus: HashSet<String> = get_random_set();
let action_new_line: HashSet<String> = get_random_set();

现在,我们要把所有常见的"词"从这HashSet个词中剔除. 我了解到differenceunion方法分别返回DifferenceUnion个迭代器.如果我这么做了:

let action_plus = HashSet::from(action_minus.union(&action_new_line).collect::<Vec<String>>());

我收到这封信:

the trait `From<Vec<String>>` is not implemented for `HashSet<_, _>`

如何处理这个问题?

推荐答案

你可以直接收集到HashSet美元.

let a = get_random_set();
let b = get_random_set();
let c = get_random_set();
let a_minus_b_minus_c = a
    .difference(&b)
    .cloned()
    .collect::<HashSet<_>>()
    .difference(&c)
    .cloned()
    .collect::<HashSet<_>>();

将输出从HashSet<&String>转换为HashSet<String>需要cloned,因为difference需要相同类型的集合.如果你接受a_minus_b_minus_c等于HashSet<&String>,你就不需要剩下的cloned.

但是,只使用减法运算符会更容易.HashSetan implementation of Sub按引用接受两个操作数,因此每次都需要添加一个引用.

let a_minus_b_minus_c = &(&a - &b) - &c;

此外,还有:

请注意,所有这些都克隆了集合中的值并返回一个新的集合,因此它们的效率并不是最优的.如果需要更高的性能,可以手动执行该操作,方法是使用retain(差、交)或extend(并)修改第一个集,或者手动创建一个包含引用的新集.

Rust相关问答推荐

在Tauri中获取ICoreWebView 2_7以打印PDF

空字符串转换为Box字符串时是否分配?<>

下载压缩文件

完全匹配包含大小写的整数范围(&Q;)

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

随机函数不返回随机值

Rust 中的复合 `HashSet` 操作或如何在 Rust 中获得 `HashSet` 的显式差异/并集

Google chrome 和 Apple M1 中的计算着色器

如何保存指向持有引用数据的指针?

如何将 &[T] 或 Vec<T> 转换为 Arc<Mutex<[T]>>?

使用 lalrpop 在 rust 中解析由 " 引用的字符串

如何在 Emacs Elisp 中获得类似格式化的 LSP?

如何连接 Rust 中的相邻切片

将 `&T` 转换为新类型 `&N`

Rust 中函数的类型同义词

当我不满足特征界限时会发生什么?

为什么基于 clap::Parser 读取的大量数字进行计算比硬编码该数字时慢?

如何在 nom 中构建负前瞻解析器?

为什么我不能为 Display+Debug 的泛型类型实现 std::error::Error 但有一个不是泛型参数的类型?

来自外部函数的future 内部可变引用