Rust &引用;关联类型。。。必须指定“;,但不是';不曾

Rust &引用;关联类型。。。必须指定“;,但不是';不曾,rust,associated-types,dynamic-dispatch,trait-objects,Rust,Associated Types,Dynamic Dispatch,Trait Objects,为什么这里需要关联的类型,即使它从未使用过 trait Tr { type Ty; fn go(&self) -> () {} } fn foo(t: dyn Tr) -> () { t.go() } 我明白了 2 | Ty型; |----------`Ty`在此处定义 ... 6 | fn foo(t:dyn Tr)->{ |^^^必须指定关联的类型'Ty' 您正在创建一个trait对象,trait对象需要指定所有关联的类型。您的案例非常简单

为什么这里需要关联的类型,即使它从未使用过

trait Tr {
    type Ty;
    fn go(&self) -> () {}
}

fn foo(t: dyn Tr) -> () {
    t.go()
}
我明白了

2 | Ty型;
|----------`Ty`在此处定义
...  
6 | fn foo(t:dyn Tr)->{
|^^^必须指定关联的类型'Ty'

您正在创建一个trait对象,trait对象需要指定所有关联的类型。您的案例非常简单,trait的方法不使用关联的类型,但设计用于更一般的案例

如果您只是使用了一个由
Tr
绑定的类型参数,则不需要指定关联的类型:

fn foo<T: Tr>(t: T) -> () {
    t.go()
}
这是因为trait对象在编译时没有已知的大小,相反,您需要将它们放在一个引用后面,该引用确实有已知的大小

fn foo(t: &dyn Tr<Ty = SomeType>) -> () {
    t.go()
}