rust 泛型的一个疑问

2023-05-22 10:05:33 +08:00
 yujianwjj
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
    }
}
1791 次点击
所在节点    Rust
5 条回复
xtreme1
2023-05-22 10:17:11 +08:00
GuuJiang
2023-05-22 10:19:15 +08:00
因为 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
2023-05-22 12:47:15 +08:00
因为你可以在 impl 级别限定 t 的 traits ,如果限定了只有 t impl 了这个 trait 才能用里面的函数,具体参考 std 的 hashmap ,key 需要 impl hash 和 eq 才能用 insert 那些函数
viruscamp
2023-06-23 23:42:11 +08:00
省略 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
2023-11-02 14:24:04 +08:00
impl<T> Point<T> { ... }

第一个 T 是声明,你给这个 imple 声明了一个泛型,取名为 T
第二个 T 是使用,你把刚刚声明的 T 使用在了 Point 上

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/941826

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX