gpt4 book ai didi

rust - 如何在 Rust 中将类型参数指定为函数参数?

转载 作者:行者123 更新时间:2023-12-04 20:04:39 26 4
gpt4 key购买 nike

我正在尝试制作一个包含 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));
}

关于rust - 如何在 Rust 中将类型参数指定为函数参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60086666/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com