У меня есть черта под названием Sleep:
pub trait Sleep {
fn sleep(&self);
}
Я мог бы предоставить разные реализации сна для каждой структуры, но оказалось, что большинство людей спят очень небольшим количеством способов. Вы можете спать в кровати:
pub trait HasBed {
fn sleep_in_bed(&self);
fn jump_on_bed(&self);
}
impl Sleep for HasBed {
fn sleep(&self) {
self.sleep_in_bed()
}
}
Если вы в походе, вы можете спать в палатке:
pub trait HasTent {
fn sleep_in_tent(&self);
fn hide_in_tent(&self);
}
impl Sleep for HasTent {
fn sleep(&self) {
self.sleep_in_tent()
}
}
Есть несколько странных случаев. У меня есть друг, который может спать, стоя у стены, но большинство людей в большинстве случаев попадают в простой случай.
Мы определяем некоторые структуры и позволяем им спать:
struct Jim;
impl HasBed for Jim {
fn sleep_in_bed(&self) {}
fn jump_on_bed(&self) {}
}
struct Jane;
impl HasTent for Jane {
fn sleep_in_tent(&self) {}
fn hide_in_tent(&self) {}
}
fn main() {
use Sleep;
let jim = Jim;
jim.sleep();
let jane = Jane;
jane.sleep();
}
Ой-ой! Ошибка компиляции:
error[E0599]: no method named 'sleep' found for type 'Jim' in the current scope
--> src/main.rs:44:9
|
27 | struct Jim;
| ----------- method 'sleep' not found for this
...
44 | jim.sleep();
| ^^^^^
|
= help: items from traits can only be used if the trait is implemented and in scope
= note: the following trait defines an item 'sleep', perhaps you need to implement it:
candidate #1: 'Sleep'
error[E0599]: no method named 'sleep' found for type 'Jane' in the current scope
--> src/main.rs:47:10
|
34 | struct Jane;
| ------------ method 'sleep' not found for this
...
47 | jane.sleep();
| ^^^^^
|
= help: items from traits can only be used if the trait is implemented and in scope
= note: the following trait defines an item 'sleep', perhaps you need to implement it:
candidate #1: 'Sleep'
Эта ошибка компилятора странная, потому что если с чертой, реализующей другую черту, было что-то не так, я ожидал услышать об этом, когда делал это, не в самой нижней части программы, когда пытался использовать результат.
В этом примере есть только 2 структуры и 2 способа спать, но в общем случае есть много структур и несколько способов спать (но не так много, как есть структуры).
Bed - это, в основном, реализация для Sleep, но в общем случае Bed имеет много применений и может реализовать много вещей.
Единственный очевидный подход состоит в том, чтобы преобразовать impl Sleep for... в макрос, который использует себя, но кажется хакерским и ужасным.