我正在研究数据库项目的类型系统。一个问题是将类型 id 映射到给定类型 id 和地址的读取器,函数可以将任何数据类型从内置 u32
、 String
返回到定义的结构。
我对作家没有任何问题,比如这样的宏
fn set_val (data: &Any, id:i32, mem_ptr: usize) {
match id {
$(
$id => $io::write(*data.downcast_ref::<$t>().unwrap(), mem_ptr),
)*
_ => (),
}
}
但是对于读者来说
Any
似乎不适合用作返回值,因为 the trait bound "std::any::Any + 'static: std::marker::Sized" is not satisfied
。我也尝试返回作为引用,但我被困在了一生 fn get_val (id:i32, mem_ptr: usize) -> Option<& Any> {
match id {
$(
$id => Some(&$io::read(mem_ptr)),
)*
_ => None,
}
}
提示
missing lifetime specifier
。如果 'static
由于返回值的存活时间不够长而无法在此处工作,我如何在此处指定生命周期?附注。 $io 的 read 函数返回任何类型的类型。
最佳答案
Any
是一个特征,这意味着它没有大小,因此不能由函数按原样返回。
但是,您可以尝试将其装箱:
fn get_val (id:i32, mem_ptr: usize) -> Option<Box<Any>> {
match id {
$(
$id => Some(Box::new($io::read(mem_ptr))),
)*
_ => None,
}
}
一个例子 playpen 。
关于rust - 如何从函数返回 Any?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39976890/