如何从一个函数中返回 Any?

4

我正在为一个数据库项目工作设计类型系统。其中一个问题是将类型ID映射到读取器,给定类型ID和地址,函数可以返回从内置、到定义的结构体等任何数据类型。

对于写入器,例如宏之类的我没有任何问题。

    fn set_val (data: &Any, id:i32, mem_ptr: usize) {
         match id {
             $(
                 $id => $io::write(*data.downcast_ref::<$t>().unwrap(), mem_ptr),
             )*
             _ => (),
         }
    }

但对于读者来说,Any 作为返回值似乎不太舒适,因为 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,那么我该如何指定生命周期呢?

PS. $io 的 read 函数返回任何类型。

1个回答

10

Any是一个特质(trait),这意味着它是不固定大小的(unsized),因此不能直接作为函数返回值。

不过,你可以尝试将其装箱(boxing):

fn get_val (id:i32, mem_ptr: usize) -> Option<Box<Any>> {
     match id {
         $(
             $id => Some(Box::new($io::read(mem_ptr))),
         )*
         _ => None,
     }
}

一个例子playpen


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接