V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yujianwjj
V2EX  ›  Rust

rust 泛型的一个疑问

  •  
  •   yujianwjj · 2023-05-22 10:05:33 +08:00 · 1789 次点击
    这是一个创建于 552 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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-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 不是一个具体类型
    qscasdqwezxc
        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 那些函数
    viruscamp
        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 都不会是别的意思 }`
    shenyuzhi
        5
    shenyuzhi  
       2023-11-02 14:24:04 +08:00
    impl<T> Point<T> { ... }

    第一个 T 是声明,你给这个 imple 声明了一个泛型,取名为 T
    第二个 T 是使用,你把刚刚声明的 T 使用在了 Point 上
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2740 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 10:09 · PVG 18:09 · LAX 02:09 · JFK 05:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.