yujianwjj
V2EX  ›  Rust

rust 泛型的一个疑问

By yujianwjj at 2023 年 5 月 22 日 · 2968 次点击
struct Point<T> {
    x: T,
    y: T,
}

impl<T> Point<T> {
    fn x(&self) -> &T {
        &self.x
    }
}

为啥 impl 后面也要加个 <T>,不加的话我感觉可读性上也没问题。

impl Point<T> {
    fn x(&self) -> &T {
        &self.x
    }
}
5 条回复  •  2023-11-02 14:24:04 +08:00
GuuJiang
   2
GuuJiang  
   2023 年 5 月 22 日 via iPhone   ❤️ 2
因为 rust 支持仅为某个具体类型实现,例如
impl Point<i32> {
fn x(&self) -> &i32 {
&self.x
}
}

Point {x: 1, y: 2}.x() //ok
Point {x: 1.0, y: 2.0}.x() //compile error

所以需要前面的<T>来指明后面的 T 不是一个具体类型
qscasdqwezxc
   3
qscasdqwezxc  
   2023 年 5 月 22 日 via Android
因为你可以在 impl 级别限定 t 的 traits ,如果限定了只有 t impl 了这个 trait 才能用里面的函数,具体参考 std 的 hashmap ,key 需要 impl hash 和 eq 才能用 insert 那些函数
viruscamp
   4
viruscamp  
   2023 年 6 月 23 日
省略 impl 后的<T> 就很可能出现这种情况
```rust
struct Point<T> {
x: T,
y: T,
}
// 实现是通用的还是只针对一个类型,这里看不出来了
impl Point<T> {
fn x(&self) -> &T {
&self.x
}
}

struct T;
```
对 rust 这种语法要求严格的语言来说,什么都是要先定义后使用的,泛型类型别名也是
`impl<T(定义)> Point<T(使用)> { 此范围内所有的 T 都不会是别的意思 }`
shenyuzhi
   5
shenyuzhi  
   2023 年 11 月 2 日
impl<T> Point<T> { ... }

第一个 T 是声明,你给这个 imple 声明了一个泛型,取名为 T
第二个 T 是使用,你把刚刚声明的 T 使用在了 Point 上
© 2026 V2EX · 30ms · 3.9.8.5