我有一個特點叫Sleep
調用方法:我實現了一個特質另一個特質,但不能從兩個性狀
pub trait Sleep {
fn sleep(&self);
}
我可以爲每一個結構不同的實現的sleep
,但事實證明,大多數人以非常少的方式睡覺。你可以睡在牀上:
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()}
}
有一些古怪的情況。我有一個可以睡在牆上的朋友,但大多數人在大多數情況下會陷入一個簡單的情況。
我們定義了一些結構,讓他們sleep
:
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: no method named `sleep` found for type `Jim` in the current scope
--> src/main.rs:43:9
|
43 | jim.sleep();
| ^^^^^
|
= help: items from traits can only be used if the trait is implemented and in scope; the following trait defines an item `sleep`, perhaps you need to implement it:
= help: candidate #1: `Sleep`
error: no method named `sleep` found for type `Jane` in the current scope
--> src/main.rs:46:10
|
46 | jane.sleep();
| ^^^^^
|
= help: items from traits can only be used if the trait is implemented and in scope; the following trait defines an item `sleep`, perhaps you need to implement it:
= help: candidate #1: `Sleep`
此編譯器錯誤很奇怪,因爲如果有什麼問題實施其他性狀的特點,我希望聽到關於它的方式回來時,我這樣做,而不是在程序時的最底部我嘗試使用結果。
在這個例子中,只有2個結構和2種睡眠方式,但在一般情況下,有許多結構和幾種睡眠方式(但結構並不多)。
A Bed
主要是Sleep
的實現,但在一般情況下,Bed
有很多用途,可以實現很多功能。
唯一立即明顯的方法是將impl Sleep for...
轉換爲自己使用的宏,但這看起來很駭人而且可怕。
不能這樣(理論上)可以在來電者的喜歡的東西方消歧'使用HasBed;'? – Drew 2015-03-25 13:37:59
我不知道編譯器的詳細信息,以便對啓用它有多複雜進行有根據的猜測。 – Shepmaster 2015-03-25 13:47:38
@Drew問題是沒有實現類似的東西,它從語言設計角度尋找一個好的設計是可取的。並激勵它(這將是解決可以不同解決的問題的重要補充)。 – delnan 2015-03-25 16:42:29