我正在學習Rust,並且遇到了涉及閉包的令人煩惱的問題。我已經獲得了許多基本的關閉示例,但現在我已經走出了基本的「加法器」和「調用」示例,事情變得雜亂無章。這是我的代碼,其中工程第一部分:從涉及Rust中的泛型的特徵方法返回閉包
trait TransformationElt<T, F> where F: Fn(T) -> T {
fn get_transform(&self) -> Box<F>;
}
pub struct AddSome { pub x: i64 }
impl AddSome {
fn the_transform(&self) -> Box<Fn(i64) -> i64> {
Box::new(|x: i64| x + 1 as i64)
}
}
這成功地返回一個堆分配封閉,增加了1,實施我們的AddSome
類型。我想AddSome
實現TransformationElt
,專門爲類型i64
:
impl<F: Fn(i64) -> i64> TransformationElt<i64, F> for AddSome {
fn get_transform(&self) -> Box<F> {
Box::new(move |x: i64| x + self.x as i64)
}
}
經過一番兩輪牛車和嘗試不同的東西,我仍然不能得到它來編譯。我通常得到的錯誤是:
src/lex/math/algebra/groups.rs:31:16: 31:46 error: mismatched types: expected
F
, found[[email protected]/lex/math/algebra/groups.rs:31:16: 31:46 self:_]
(expected type parameter, found closure) [E0308]
如何解決這個看似基本的問題,實現我的「改造」型?
最後一件事 - 我有理由想把事情當作關閉。我打算把它們組合起來,等等,我真的需要更高級的功能。