У меня есть следующий упрощенный код:
use std::collections::BinaryHeap;
use std::rc::Rc;
struct JobId;
struct Coord;
struct TimeStep;
pub trait HasJob {
fn id(&self) -> JobId;
fn start(&self) -> Coord;
fn end(&self) -> Coord;
fn earliest_start(&self) -> TimeStep;
fn latest_finish(&self) -> TimeStep;
}
type JobPtr = Rc<HasJob>;
// a concrete class that implements the above trait
// and other basic traits like Eq, Hash, Ord, etc
pub struct Job {}
// another class that implements the HasJob trait
pub struct JobPrime {}
fn main() {
// this line raises a compiler error
let heap: BinaryHeap<JobPtr> = BinaryHeap::with_capacity(10);
}
Основная идея состоит в том, чтобы использовать (уникальные) id
для заказа.
Инициализация кучи вызывает следующую ошибку:
error[E0277]: the trait bound `HasJob: std::cmp::Ord` is not satisfied
--> src/main.rs:24:36
|
24 | let heap: BinaryHeap<JobPtr> = BinaryHeap::with_capacity(10);
| ^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::cmp::Ord` is not implemented for `HasJob`
|
= note: required because of the requirements on the impl of `std::cmp::Ord` for `std::rc::Rc<HasJob>`
= note: required by `<std::collections::BinaryHeap<T>>::with_capacity`
Я только начал пробовать свои силы в Rust и имею опыт работы с ООП/С++/Java. Намерение состоит в том, чтобы использовать трейт HasJob
в качестве «интерфейса» и использовать его для вызова стирания/динамической отправки типов по отношению к общим коллекциям/контейнерам — общий шаблон ООП.
Если я правильно понимаю, общий параметр BinaryHeap
имеет ограничение, что переданный ему конкретный тип должен реализовать черту Ord
. Попытка расширить исходную черту требуемой чертой, например...
pub trait HasJob: Ord + /*others*/
... нарушает гарантию безопасности объектов Rust и вызывает следующую ошибку компилятора:
error[E0038]: the trait `HasJob` cannot be made into an object
--> src/main.rs:16:22
|
16 | type JobPtr = Rc<HasJob>;
| ^^^^^^ the trait `HasJob` cannot be made into an object
|
= note: the trait cannot use `Self` as a type parameter in the supertraits or where-clauses
Как обойти вышеуказанную проблему?
HasJob
у вас есть? - person E_net4 the curator   schedule 06.03.2018JobPtr
, используя толькоid
,start
,end
,earliest_start
иlatest_finish
? - person trentcl   schedule 06.03.2018HasJob
, вы должны реализоватьOrd
дляHasJob
, а не только для типа, реализующегоHasJob
(поскольку невозможно сравнивать разные типы, даже если они оба реализуютOrd
). - person trentcl   schedule 06.03.2018