我正在尝试定义一个将引用作为参数的函数,并在被引用对象上调用通用方法,并传入一个具体值。我需要一种方法,要求传递给我的函数的参数的泛型类型是函数将使用它的具体类型的特征。我似乎无法弄清楚如何做到这一点。
我试图实现的那种事情的最小例子:
trait Vehicle {}
trait Floating {}
struct Boat;
impl Vehicle for Boat {}
impl Floating for Boat {}
fn main() {
let mut a: Vec<Box<dyn Vehicle>> = vec![];
populate(&mut a); // Does not compile
let mut b: Vec<Box<dyn Floating>> = vec![];
populate(&mut b); // Also does not compile
}
fn populate(receiver: &mut Vec<Box<Boat>>) { // What should I put here?
receiver.push(Box::new(Boat{}));
}
尝试编译它会出现以下错误:
error[E0308]: mismatched types
--> src/main.rs:10:14
|
10 | populate(&mut a); // Does not compile
| ^^^^^^ expected struct `Boat`, found trait object `dyn Vehicle`
|
= note: expected mutable reference `&mut std::vec::Vec<std::boxed::Box<Boat>>`
found mutable reference `&mut std::vec::Vec<std::boxed::Box<dyn Vehicle>>`
error[E0308]: mismatched types
--> src/main.rs:13:14
|
13 | populate(&mut b); // Also does not compile
| ^^^^^^ expected struct `Boat`, found trait object `dyn Floating`
|
= note: expected mutable reference `&mut std::vec::Vec<std::boxed::Box<Boat>>`
found mutable reference `&mut std::vec::Vec<std::boxed::Box<dyn Floating>>`
我没想到它会编译,但我不知道如何更改签名populate以便它会。我来自 Java 领域,我将使用有界通配符(例如void populate(List<? super Boat> receiver))来实现这一点,但我找不到任何建议 Rust 提供等效语义的东西。
我该如何解决我对populate这里的定义?
我是 Rust 的新手,所以如果我完全找错了树,请耐心等待。我四处搜索,似乎找不到应该如何实现这种模式的示例。