Как проверить наличие структуры в коллекции структур по структурному равенству? - PullRequest
0 голосов
/ 27 января 2019

Если у меня есть структура:

pub struct Test {
    val1: u8,
    val2: u8,
}

, и я делаю vec! из них, например:

let a = Test{val1: 1, val2: 1};
let b = Test{val1: 1, val2: 2};
let c = Test{val1: 1, val2: 2};
let my_vec = vec![a, b];

Как я могу определить, содержит ли my_vec структуру сте же значения, что и c?

Ответы [ 2 ]

0 голосов
/ 27 января 2019

Vec имеет метод contains для проверки, содержит ли оно конкретное значение.Метод требует, чтобы элементы реализовали PartialEq, который вы можете автоматически получить следующим образом:

#[derive(PartialEq)]
pub struct Test {
    val1: u8,
    val2: u8,
}

Так что теперь вы можете сделать:

assert!(my_vec.contains(&c));

Если ваша коллекция становится большой, этобудет довольно неэффективным, так как он будет сравнивать каждый элемент, пока не найдет тот, который соответствует.HashSet будет более эффективным, но поставляется с собственным требованием, что вам нужно также реализовать Eq и Hash.К счастью, их обычно можно получить таким же образом.

0 голосов
/ 27 января 2019

Вам необходимо указать PartialEq и метод eq, как указано в https://doc.rust -lang.org / std / cmp / trait.PartialEq.html

pub struct Test {
    val1: u8,
    val2: u8,
}

impl PartialEq for Test {
    fn eq(&self, other: &Test) -> bool {
        self.val1 == other.val1 && self.val2 == other.val2
    }
}

fn main() {
    let a = Test{val1: 1, val2: 1};
    let b = Test{val1: 1, val2: 2};
    let c = Test{val1: 1, val2: 2};
    let my_vec = vec!(a, b);

    println!("{}", my_vec.contains(&c));
}
...