[英]How do I specify type parameters as being function arguments in Rust?
我正在嘗試制作一個包含Box<dyn Fn(&E)>
,其中E
被指定為類型的一部分。 這一直有效,直到E
包含一個引用,此時它開始詢問不相關的生命周期。
一個更簡單的例子:
pub struct CallbackTest<E> {
pub cb: Box<dyn Fn(&E)>,
}
impl<E> CallbackTest<E> {
pub fn new<F>(cb: F) -> Self
where
F: Fn(&E)
{
Self { cb: Box::new(cb) }
}
}
pub struct GameData { /* ... */ }
pub type TestRef = CallbackTest<(u32, &GameData)>;
這給了我一個missing lifetime specifier
錯誤。 我可以在TestRef
上放置一個生命周期參數以使其工作,但這不是正確的生命周期。 我不希望&GameData
在CallbackTest
的整個生命周期中都存在,只是在函數調用期間。
編輯: &GameData 是故意的。 這不是一個錯誤。 我希望我的改變使這背后的目標更加明顯。
有什么建議嗎?
我們在這里rust.playground
use std::marker::PhantomData;
pub struct CallbackTest<'a, E, Fa: 'a + Fn(&E)> {
pub cb: Box<Fa>,
_e: &'a PhantomData<E>,
}
impl<'a, E, Fa: 'a + Fn(&E)> CallbackTest<'a, E, Fa> {
pub fn new(cb: Fa) -> Self
{
Self {
cb: Box::new(cb),
_e: &PhantomData
}
}
}
pub struct GameData {
pub field: i32,
}
pub type TestRef<'a, 'b, Fb> = CallbackTest<'b, (u32, &'a GameData, ), Fb>;
fn main() {
let game_data = GameData{ field: 42};
let test_ref: TestRef<_> = CallbackTest::new(|(val, gd): &(u32, &GameData)| { println!("val:{}, field:{}", val, (*gd).field)});
(test_ref.cb)(&(24, &game_data));
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.