Rust жалуется, что BitOr не реализован для HashSet при выполнении объединения, в документации утверждается, что это должно быть - PullRequest
2 голосов
/ 09 апреля 2020

Минимальный пример:

use std::collections::HashSet;

struct Something {
    a: HashSet<Point>,
    b: HashSet<Point>
}

impl Something {
    fn TEST(&self) {
        let new = self.a | self.b;
    }
}

#[derive(Eq, PartialEq, Hash, Copy, Clone)]
struct Point {
    x: usize,
    y: usize
}

Проверьте это на Rust Playground . Если вы попытаетесь скомпилировать этот код, Rust пожалуется на error[E0369]: no implementation for std::collections::HashSet<Point> | std::collections::HashSet<Point>.

Но согласно документам для HashSet, по крайней мере, насколько я понимаю, черта BitOr должна быть реализован для HashSet, где T: Eq + Hash + Clone, который Point явно здесь. Так что же на самом деле происходит, и как мне это исправить?

1 Ответ

3 голосов
/ 09 апреля 2020

Более подробно рассмотрим реализацию BitOr для HashSet:

impl<T, S> BitOr<&HashSet<T, S>> for &HashSet<T, S>
where
   ...

BitOr реализовано только для ссылок на HashSet s, а не для собственные значения.

Переписывание реализованного для Something::TEST следующим образом скомпилирует, как ожидается.

impl Something {
    fn TEST(&self) {
        let new = &self.a | &self.b;
    }
}

Обратите внимание, что мы используем ссылки на self.a и self.b.

...