我想調用函數依賴於外部數據, 這樣的:是否可以使用特徵作爲免費函數的語法糖?
struct Foo {
data: &'static str,
handler: Option<fn (i32) -> String>,
}
fn aaa_converter(_: i32) -> String { unimplemented!(); }
fn bbb_converter(_: i32) -> String { unimplemented!(); }
fn main() {
let _ = Foo{data: "aaa", handler: Some(aaa_converter)};
let _ = Foo{data: "bbb", handler: Some(bbb_converter)};
let _ = Foo{data: "ccc", handler: None};
}
我作爲輸入字符串「AAA」,我需要調用aaa_converter
。所有工作正常,我把Foo
對象放入哈希映射中,如果不是None
,則調用合適的handler
。
現在我有很多這樣的轉換器,我想從語言的幫助來處理它們。
理想情況下,將語法如下:
trait Handler {
fn handle(a: i32) -> String;
}
impl Handler for "aaa" {
// ...
}
,我能得到的最好的比賽是:
trait Handler {
fn handle(/*&self, */a: i32) -> String;
}
struct aaa;
impl Handler for aaa {
fn handle(/*&self, */a: i32) -> String {
unimplemented!();
}
}
struct Foo {
data: &'static str,
handler: &'static Handler,
}
fn main() {}
但這樣的代碼不能編譯:
the trait `Handler` cannot be made into an object
= note: method `handle` has no receiver
How to call a trait method without a struct instance?看起來相關,但答案中的RFC已過時。從那以後,這種語言也可能發生了一些變化?
是否可以使用特徵作爲指向免費函數的簡單指針?
或者還有另一種方法來組織處理程序?
*爲什麼*?爲什麼不只是有一個空的結構,採取'self'參數,而不是使用它? – Shepmaster
@Shepmaster:爲什麼要用特質開始? ;) –
@MatthieuM。我的精神感覺告訴我,有時他們會想要狀態。例如,'Foo'可能是實際的處理程序,'data'應該通過'self'來訪問。 – Shepmaster