Опция сравнения ржавчины> с опцией <& [u8]> - PullRequest
7 голосов
/ 14 октября 2019

Есть ли элегантный способ сравнить Option<Vec<u8>> на равенство с Option<&[u8]>? (Или эквивалентно Result вместо Option.)

Ответы [ 2 ]

11 голосов
/ 14 октября 2019

Возможно, это неоптимально, но этот код, похоже, компилируется:

fn cmp(first: Option<Vec<u8>>, second: Option<&[u8]>) -> bool {
    first.as_ref().map(Vec::as_ref) == second
}

Playground

Здесь есть два ключевых преобразования:

  1. Первый опцион содержит собственное значение, второй - ссылку. Таким образом, мы должны перейти от Option<T> (или &Option<T>) к Option<&T>, и это достигается с помощью as_ref метода Option.

  2. Первый Option теперь содержит &Vec<u8>, и мы собираемся сравнить его с &[u8]. Это снова обрабатывается методом as_ref, теперь определенным для черты AsRef<[u8]> и реализованным для Vec.

10 голосов
/ 14 октября 2019

Вам просто нужно конвертировать Option<Vec<u8>> в Option<&[u8]>, используя as_ref() и Index черту:

fn foo(a: Option<Vec<u8>>, b: Option<&[u8]>) -> bool {
    a.as_ref().map(|x| &x[..]) == b
}

В будущем вы можете просто использовать as_deref():

fn foo(a: Option<Vec<u8>>, b: Option<&[u8]>) -> bool {
    a.as_deref() == b
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...