• Geek_de05b4
    2023-11-03 来自上海
    impl<T: std::ops::Add<Output = T>> Bar<T> { fn plus(self, other: Bar<T>) -> T { self.value + other.value } } impl Bar<u32> { fn plus(&self, other: &Bar<u32>) -> u32 { self.value + other.value } } //Output: error[E0592]: duplicate definitions with name `plus` --> src/main.rs:64:5 | 64 | fn plus(self, other: Bar<T>) -> T { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ duplicate definitions for `plus` ... 70 | fn plus(&self, other: &Bar<u32>) -> u32 { | --------------------------------------- other definition for `plus` 不能

    作者回复: 👍

    
    1
  • 小云同学
    2023-11-03 来自中国台湾
    思考题:"为泛型实现了一个方法,能否再为具化类型实现一个同名方法",取决于这个泛型能否表示相应的具化类型。比如为泛型 T 和 String 实现了相同的方法,由于 T 没有施加任何约束,它可以代表 String。那么当调用方法时,对于具化类型 String 来说,要调用哪一个呢?因此会出现歧义,编译器会报错:方法被重复定义了。 但如果给泛型 T 施加了一个 Copy 约束,要求 T 必须实现了 Copy trait,那么就不会报错了,因为此时 T 代表不了 String,所以调用方法不会出现歧义。但如果再为 i32 实现一个同名方法就会报错了,因为 i32 实现了 Copy,它可以被 T 表示。 PS:老师我在 06 讲提了一个问题,之前在学 Rust 的时候就一直困扰着我,还麻烦老师解答一下。

    作者回复: 👍

    
    
  • 一个人旅行
    2023-11-03 来自北京
    不能,编译器会提示duplicate definitions for XXXXX。 如果想为具化类型再实现同样的方法,则可以定义一个trait,用具化类型实现这个trait,来达到"为具化类型再实现同样的方法“的目的。

    作者回复: 👍

    
    
  • 伯阳
    2023-11-03 来自北京
    和Java的范型类似
    
    1