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
}
}
1
xtreme1 2023-05-22 10:17:11 +08:00 1
|
2
GuuJiang 2023-05-22 10:19:15 +08:00 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 不是一个具体类型 |
3
qscasdqwezxc 2023-05-22 12:47:15 +08:00 via Android
因为你可以在 impl 级别限定 t 的 traits ,如果限定了只有 t impl 了这个 trait 才能用里面的函数,具体参考 std 的 hashmap ,key 需要 impl hash 和 eq 才能用 insert 那些函数
|
4
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 都不会是别的意思 }` |
5
shenyuzhi 2023-11-02 14:24:04 +08:00
impl<T> Point<T> { ... }
第一个 T 是声明,你给这个 imple 声明了一个泛型,取名为 T 第二个 T 是使用,你把刚刚声明的 T 使用在了 Point 上 |