我想调用函数依赖于外部数据, 这样的:是否可以使用特征作为免费函数的语法糖?
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