为什么Rust在“impl”关键字后需要泛型类型声明?

时间:2017-08-03 02:02:40

标签: rust

定义泛型类型的方法需要在impl之后添加泛型类型:

struct GenericVal<T>(T,);
impl <T> GenericVal<T> {}

我觉得删除<T>似乎没问题:

struct GenericVal<T>(T,);
impl GenericVal<T> {}

有什么特别的考虑吗?

1 个答案:

答案 0 :(得分:14)

Rust允许您编写仅适用于某些特定类型参数组合的impl块。例如:

struct GenericVal<T>(T);

impl GenericVal<u32> {
    fn foo(&self) {
        // method foo() is only defined when T = u32
    }
}

此处,GenericVal类型是通用的,但impl本身不是。

因此,如果您要编写适用于所有impl类型的GenericVal<T>块,您必须首先在impl本身上声明类型参数(否则,T会尝试查找名为T的类型。

struct GenericVal<T>(T);

impl<T> GenericVal<T> {
    fn foo(&self) {
        // method foo() is always present
    }
}

此声明还允许您使用可以多次使用的单个类型参数,从而强制类型相同。

struct GenericVal<T, U>(T, U);

impl<V> GenericVal<V, V> {
    fn foo(&self) {
        // method foo() is only defined when T = U
    }
}