按照下面的例子,我试图将函数存储为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
}
字符串
1条答案
按热度按时间5kgi1eie1#
你不能命名返回类型,但你可以让编译器推断它:
字符串