6

クロージャーを含む構造体のコンストラクターとして機能するメソッドを実装するにはどうすればよいですか? 私は Rust の初心者であり、クロージャが積極的に取り組んでいるため、ドキュメントで解決策を見つけるのに苦労しています。

struct A<'self> {
    fOne: &'self fn(),
}

impl<'self> A<'self> {
    fn new() {
        println!("Ideally this would return a struct of type A");
    }
}

fn run(f: &fn()) {
    f();
}

fn main() {
    let apples = 5;
    let example = A {
        fOne: || {
            println!("{} apples on the tree.", apples);
        },
    };
    A::new();

    run(example.fOne);
}

これは、多くの問題に遭遇せずに取得できる限りです。A::new()クロージャーを引数として受け入れ、Aその引数でタイプの構造体を作成し、新しく作成された構造体を返すバージョンを作成できないようです。これを行う方法はありますか、そうでない場合、何がわかりませんか?

4

1 に答える 1

6

クロージャーはジェネリックの一種として扱われます。型パラメータ name を使用するのが一般的Fです:

struct A<F> {
    f_one: F,
}

impl<'a, F> A<F> {
    fn new(f: F) -> Self {
        A { f_one: f }
    }
}

fn main() {
    let apples = 5;
    let example = A::new(|| println!("{} apples on the tree.", apples));

    (example.f_one)(); // extra parens to disambiguate from calling a method
}

多くの場合impl、ジェネリックを特定のタイプのクロージャに制限するタイプまたはブロックの制限が表示されます。

struct A<F>
where
    F: Fn(),
{
    f_one: F,
}

impl<'a, F> A<F>
where
    F: Fn(),
{
    fn new(f: F) -> Self {
        A { f_one: f }
    }
}
于 2013-11-12T06:55:55.490 に答える