rust 将返回impl Trait的函数存储为trait对象

46qrfjad  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(115)

按照下面的例子,我试图将函数存储为trait对象。我已经解决了如何对返回具体类型的函数执行这一操作,通过使用as将函数项强制转换为函数指针。然而,我也想在Vector中存储返回impl Element的函数,据我所知,这需要在HasChildren实现中使用泛型参数,但我不知道如何或应该将其转换为什么,以便将其用作trait对象。

trait Element {}
trait HasChildren {}

struct Foo {}
impl Element for Foo {}
impl HasChildren for Foo {}

impl HasChildren for fn(String) -> Foo {}
impl<E: Element> HasChildren for fn(i32) -> E {}

fn get_concrete_element(val: String) -> Foo {
    Foo {}
}

fn get_impl_element(val: i32) -> impl Element {
    Foo {}
}

fn main() {
    // Store various trait objects in Vec
    let mut data: Vec<Box<dyn HasChildren>> = Vec::new();
    data.push(Box::new(Foo {})); // works
    data.push(Box::new(get_concrete_element as fn(String) -> Foo)); // works
    data.push(Box::new(get_impl_element as fn(i32) -> impl Element)); // doesn't work
}

字符串

5kgi1eie

5kgi1eie1#

你不能命名返回类型,但你可以让编译器推断它:

data.push(Box::new(get_impl_element as fn(i32) -> _));

字符串

相关问题