#rust
#Ржавчина
Вопрос:
У меня есть вектор RTSPUrl
, и я хочу найти наименьший элемент.
struct RTSPUrl { /* fields omitted */ }
fn main() {
let rtsp_urls = std::vec::Vec::<RTSPUrl>::new();
let minimum_element = rtsp_urls.iter().min();
}
Однако компилятор жалуется, что RTSPUrl
должен реализовать Ord
.
error[E0277]: the trait bound `RTSPUrl: std::cmp::Ord` is not satisfied
--> src/main.rs:5:44
|
5 | let minimum_element = rtsp_urls.iter().min();
| ^^^ the trait `std::cmp::Ord` is not implemented for `RTSPUrl`
|
= note: required because of the requirements on the impl of `std::cmp::Ord` for `amp;RTSPUrl`
Но этот тип не из моего ящика, поскольку он генерируется protobuf. Есть ли что-нибудь еще, что я могу сделать?
Комментарии:
1. Если это не реализуется
Ord
, откуда вы знаете, что существует минимальное значение? Если бы я сказал вам, что элемент с индексом 0 был наименьшим, как бы вы узнали, был ли я прав или нет?
Ответ №1:
Вы можете использовать min_by
и реализовать упорядочение самостоятельно:
let minimum_element = rtsp_urls.iter().min_by(|a, b| {
// return an Ordering based on a and b
Ordering::Equal
});
Или, если вы просто упорядочиваете по какому-либо свойству RTSPUrl
, которое реализует Ord
, вы можете использовать min_by_key
:
let minimum_element = rtsp_urls.iter().min_by_key(|url| {
// return something that implements Ord based on url
url.something()
});
Вы не указали, как RTSPUrl
выглядит или как вы хотели бы, чтобы он был упорядочен, но один из этих вариантов должен работать. Ссылка на игровую площадку.
Тот же шаблон ( *_by()
и *_by_key()
) используется в другом месте, например max
, или slice.sort
.
Ответ №2:
Вы можете использовать Iterator::min_by
и реализовать собственное сравнение, основанное на содержимом RTSPUrl
:
let minimum_element = rtsp_urls.iter().min_by(|a, b| ...)
Ordering
Я полагаю, ваша функция должна возвращать an .