A
是一種結構。它包含一個B
(又名B
的矢量)列表。 A
實現了add_b
方法,該方法在B
的列表中添加B
實例。 B
結構包含一個閉包屬性f
。如果我將一個B
添加到add_b
的向量中,那沒問題。如果我用add_b
添加兩個向量,我得到一個錯誤,說兩個閉包是不同的。而且我不知道如何避免這個錯誤並修復我的代碼。這是一個有點難以解釋(約真的很抱歉,如果你想我可以編輯),這裏是一個小例子:預期關閉,發現不同的關閉
// 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)來簡化我的代碼,然後嘗試在struct聲明中添加'Vec>',然後在'add_b'中添加'Box :: new(...)',並且仍然具有相同的錯誤。不知道明白我錯過了什麼,我仍然需要挖掘。 –
生鏽的遊樂場在這裏:http://play.integer32.com/?gist = 74fa771c562d30c541db54b2e8cf8ec8 –
如果閉包實際上沒有從環境中捕獲任何變量,那麼可能是沒有價值的,那麼'fn()'是一個合適的類型並且不需要裝箱。 –