gpt4 book ai didi

rust - 如何将变量装箱为带有类型参数的静态方法引用?

转载 作者:行者123 更新时间:2023-11-29 08:31:14 25 4
gpt4 key购买 nike

我正在尝试为 Box::new 提供静态方法引用和类型参数,但无法编译它。

我有以下结构:

trait MyTrait {
fn hello(&self);
}

struct MyStruct;

impl MyTrait for MyStruct {
fn hello(&self) {
println!("Hello");
}
}

在我的 main 方法中,我想将这些结构转换为特征对象,将它们放入 Box 中,然后将其作为向量返回。我设法这样做了:

fn main() {
let my_vec = vec![MyStruct];

let my_trait_vec: Vec<Box<MyTrait>> = my_vec
.into_iter()
.map(|x| {
let boxed: Box<MyTrait> = Box::new(x);
boxed
})
.collect();
}

我正在寻找类似的东西:

let mut my_trait_vec: Vec<Box<MyTrait>> = my_vec.into_iter().map(Box::new::<MyTrait>).collect();

这不被编译器接受,它提示 Box::new() 的意外类型参数。

是否可以在不声明任何外部函数的情况下在一行中进行此装箱操作?

Playground

最佳答案

因为你想给 Box 一个类型参数类型,正确的语法是 Box::<dyn MyTrait>::new而不是 Box::new::<dyn MyTrait> .但是,这也不起作用,因为编译器会尝试将参数类型强制为 Box::new()。至 dyn MyTrait在按值传递它之前,这对于动态大小的类型是不可能的。您需要先创建框,然后才能执行未大小的强制转换,因此您的代码没问题。这是一个本质上相同的替代方案,只是写得更简洁:

let mut my_trait_vec: Vec<Box<dyn MyTrait>> = my_vec
.into_iter()
.map(|x| Box::new(x) as Box<dyn MyTrait>)
.collect();

另一种选择是定义辅助函数,例如

fn into_boxed_trait<T>(value: T) -> Box<dyn MyTrait>
where
T: MyTrait + 'static,
{
Box::new(value)
}

这将允许你写

let mut my_trait_vec: Vec<_> = my_vec
.into_iter()
.map(into_boxed_trait)
.collect();

关于rust - 如何将变量装箱为带有类型参数的静态方法引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57139758/

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