生锈中是否可能具有大小特征的多态性
Is polymorphism with sized traits possible in rust
我正在使用一个公开特征的库,该特征要求它是 Sized
。
我正在使用一个实现此特征的对象,并试图创建一个包含所有这些实例的数组。对于非大小特征,我会使用类似 Vec<Box<dyn MyNonSizedTrait>>
的东西,但是对于 Sized
特征,这是不可能的,编译器会抱怨 the trait MySizedTrait cannot be made into an object
.
有什么办法可以解决这个问题吗?
这是我正在尝试做的一个例子:
trait A: Sized {
fn do_something(&self);
}
struct B;
impl A for B {
fn do_something(&self){
println!("This is B")
}
}
struct C;
impl A for C {
fn do_something(&self) {
println!("This is C")
}
}
fn my_do_something(d: &[Box<dyn A>]) {
for i in d {
i.do_something();
}
}
fn main() {
let mut d: Vec<Box<dyn A>> = Vec::new();
d.push(Box::new(B));
d.push(Box::new(C));
my_do_something(&d);
}
dyn Trait
根据定义总是未调整大小,因为它允许其后面的对象具有从 0
到 isize::MAX
.
的任何大小
要拥有固定大小的对象和多态性,请使用 enum
。然后,您可以在 enum
本身上添加 impl
以分派对变体的调用。有一些 hacky crates 可以自动执行此操作。
我正在使用一个公开特征的库,该特征要求它是 Sized
。
我正在使用一个实现此特征的对象,并试图创建一个包含所有这些实例的数组。对于非大小特征,我会使用类似 Vec<Box<dyn MyNonSizedTrait>>
的东西,但是对于 Sized
特征,这是不可能的,编译器会抱怨 the trait MySizedTrait cannot be made into an object
.
有什么办法可以解决这个问题吗?
这是我正在尝试做的一个例子:
trait A: Sized {
fn do_something(&self);
}
struct B;
impl A for B {
fn do_something(&self){
println!("This is B")
}
}
struct C;
impl A for C {
fn do_something(&self) {
println!("This is C")
}
}
fn my_do_something(d: &[Box<dyn A>]) {
for i in d {
i.do_something();
}
}
fn main() {
let mut d: Vec<Box<dyn A>> = Vec::new();
d.push(Box::new(B));
d.push(Box::new(C));
my_do_something(&d);
}
dyn Trait
根据定义总是未调整大小,因为它允许其后面的对象具有从 0
到 isize::MAX
.
要拥有固定大小的对象和多态性,请使用 enum
。然后,您可以在 enum
本身上添加 impl
以分派对变体的调用。有一些 hacky crates 可以自动执行此操作。