为什么锈病需要泛型类型声明的“IMPL”关键字之后?

问题描述 投票:7回答:1

定义泛型类型的方法需要impl后加入泛型类型:

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

我觉得消除<T>似乎OK:

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

这是任何特殊的考虑?

rust
1个回答
16
投票

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

struct GenericVal<T>(T);

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

在这里,类型GenericVal是通用的,但impl本身是没有的。

因此,如果你要编写适用于所有类型的implGenericVal<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
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.