为什么Rust需要在“";impl";关键词?

为什么Rust需要在“";impl";关键词?,rust,Rust,定义泛型类型的方法需要在impl之后添加泛型类型: struct GenericVal<T>(T,); impl <T> GenericVal<T> {} struct-GenericVal(T,); impl GenericVal{} 我觉得删除似乎可以: struct GenericVal<T>(T,); impl GenericVal<T> {} struct-GenericVal(T,); impl GenericVal{

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

struct GenericVal<T>(T,);
impl <T> GenericVal<T> {}
struct-GenericVal(T,);
impl GenericVal{}
我觉得删除
似乎可以:

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

有什么特别的考虑吗

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

struct GenericVal<T>(T);

impl GenericVal<u32> {
    fn foo(&self) {
        // method foo() is only defined when T = u32
    }
}
此声明还允许您拥有一个可以多次使用的单一类型参数,从而强制类型相同

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

impl<V> GenericVal<V, V> {
    fn foo(&self) {
        // method foo() is only defined when T = U
    }
}
struct GenericVal(T,U);
植入通用值{
fn foo(和self){
//方法foo()仅在T=U时定义
}
}

然而,编译器似乎可以从
GenericVal
的类型参数而不是
impl
进行推断。你能解释一下为什么必须使用
impl
语法吗?我认为这不是绝对必要的,但是if有助于防止歧义。如果有人在该模块的范围内引入了名为
V
的类型,该怎么办?在
impl
中使用
V
是指具体类型
V
(如我回答中的第一个示例)还是指隐式泛型参数
V
?@yesheng正如Francis所说,impl可以用于实现特定类型,您可以认为签名impl-GenericVal{}与impl一样,impl是一个声明,GenericVal是该声明类型的用法。如果有人想知道同样的事情,请参阅我的文章,我试图用简单的示例解释为什么需要这样做。
struct GenericVal<T, U>(T, U);

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