私はこのような 、外部データに依存する関数を呼び出したい:自由な関数のための構文糖として形質を使用することは可能ですか?
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