我有一个被称为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`
这个编译错误很奇怪,因为如果有一个特质实现另一个特质时出了问题,我希望在那时就能听到错误信息,而不是在程序底部尝试使用结果时才听到。
在这个例子中,只有两个结构体和两种睡眠方式,但是在一般情况下会有许多结构体和几种睡眠方式(但并不像结构体那么多)。
Bed
主要是 Sleep
的实现,但在一般情况下,Bed
有许多用途,并且可以实现许多东西。
唯一明显的方法是将 impl Sleep for...
转换为宏,使结构体自己使用,但这似乎很不好。