У меня есть небольшая структура, содержащая только i32
:
struct MyStruct {
value: i32,
}
Я хочу реализовать Ord
для хранения MyStruct
в BTreeMap
или любой другой структуре данных, которая требует, чтобы у вас были Ord
.
В моем случае сравнение двух экземпляров MyStruct
не зависит от value
в них, но запрашивает другую структуру данных (словарь) и что структура данных уникальна для каждого экземпляра BTreeMap
я будет создавать. Так идеально было бы выглядеть так:
impl Ord for MyStruct {
fn cmp(&self, other: &Self, dict: &Dictionary) -> Ordering {
dict.lookup(self.value).cmp(dict.lookup(other.value))
}
}
Однако это будет невозможно, так как реализация Ord
может иметь доступ только к двум экземплярам MyStruct
, не более того.
Одним из решений будет сохранение указателя на словарь в MyStruct
, но это переполнение. MyStruct
должен быть простой оболочкой, а указатель удваивает размер. Другим решением является использование статического глобального, но это не очень хорошее решение.
В С++ решение было бы простым: большинство алгоритмов STL/структуры данных позволяют передавать компаратор, где он может быть объектом функции с некоторым состоянием. Поэтому я считаю, что у Руста была бы такая идиома, чтобы соответствовать этому как-то, есть ли способ сделать это?