A
は構造です。それはB
(別名ベクトルB
)のリストを含んでいます。 A
はB
のリストにB
インスタンスを追加するadd_b
メソッドを実装しています。 B
構造体にはクロージャープロパティf
が含まれています。ベクトルadd_b
でB
を1つ追加すればOKです。 add_b
という2つのベクトルを追加すると、2つのクロージャが違うというエラーが表示されます。私はこのエラーを回避してコードを修正する方法を知らない。それは(そのことについては本当に申し訳ありません、あなたが望むなら、私は編集することができます)説明するのは少し難しいですが、ここでは最小限の例です。閉鎖が予想され、別の閉鎖を見つけた
// A struct...
struct A<F> {
b_vec: Vec<B<F>> // A vector of B
}
// ...and it's implementation
impl<F> A<F> where F: Fn() {
fn new() -> A<F> {
A { b_vec: Vec::new() }
}
fn add_b(&mut self, b: B<F>) {
self.b_vec.push(b);
}
}
// B struct...
struct B<F> {
f: F
}
// ...and it's implementation
impl<F> B<F> where F: Fn() {
fn new(f: F) -> B<F> {
B { f: f }
}
}
// I add two B (with their closures arguments) in A
fn main() {
let mut a = A::new();
a.add_b(B::new(|| println!("test")));
a.add_b(B::new(|| println!("test2")));
}
でこのコードの結果:
私は複数追加することができますどのようにerror[E0308]: mismatched types
--> src/main.rs:29:22
|
29 | a.add_b(B::new(|| println!("test2")));
| ^^^^^^^^^^^^^^^^^^^^ expected closure, found a different closure
は、 B
の異なるクロージャを使用していますA
のb_vec
?
ありがとうございます!参考:あなたが書いたことを理解していると思います。コードを修正するのは簡単ではありません(私はまだ初心者です)。私は 'B'(ok、check)を削除してコードを簡略化し、構造体宣言に' Vec> 'を追加しようとした後、' add_b'に 'Box :: new(...)'を追加しても同じエラー。私が逃したものを理解していない、私はまだ掘る必要があります。 –
ここで錆びた遊び場:http://play.integer32.com/?gist = 74fa771c562d30c541db54b2e8cf8ec8 –
クロージャが実際に環境変数を取得しない場合、 'fn()'は適切な型であり、ボクシングする必要はありません。 –