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

rust 的这段代码看不懂,求指教!

  •  
  •   hahaFck · 2021-06-29 14:57:03 +08:00 · 2235 次点击
    这是一个创建于 1003 天前的主题,其中的信息可能已经有所发展或是发生改变。
    rust 的范型太复杂了。

    1.声明了一个范型结构体:

    struct Complex<T> {
    re: T,
    im: T
    }

    2.为结构体实现+操作符操作,即实现 Add trait

    impl<T: Add<T, Output=T>> Add for Complex<T> {
    type Output = Complex<T>;
    fn add(self, rhs: Complex<T>) -> Self::Output {
    Complex { re: self.re + rhs.re, im: self.im + rhs.im }
    }
    }

    3.问题就出现在这个 T: Add<T, Output=T>,系统的 Add 的定义为 pub trait Add<Rhs = Self> {...}
    明明范型参数只有一个 Rhs,并且默认值是 Self,为什么那段代码可以写成 Add<T, Output=T>,这里明明有 2 个范型参数呢,一个 T,一个 Output,有点看不明白。
    3 条回复    2021-10-18 10:43:31 +08:00
    codehz
        1
    codehz  
       2021-06-29 15:06:27 +08:00
    Output 是 associted type,而不是泛型本身的参数
    换句话说,Add 只要确定了第一个 T 就能唯一确定实现了,这里的 Output = T 写法实际上是简写,完整展开可以写成这样
    impl <T> Add for Complex<T> where
    T: Add<T>,
    <T as Add<T>>::Output: T,
    也就是说后面的 Output 实际上是针对 T as Add<T> 的额外约束,以确保不会意外匹配到 Output 不是 T 的类型
    参考:
    https://doc.rust-lang.org/rust-by-example/generics/assoc_items/types.html
    https://stackoverflow.com/questions/32059370/when-is-it-appropriate-to-use-an-associated-type-versus-a-generic-type
    https://blog.thomasheartman.com/posts/on-generics-and-associated-types
    hahaFck
        2
    hahaFck  
    OP
       2021-06-29 15:23:43 +08:00
    @codehz 多谢大神指点,我在看看资料,另外还有一个问题,就是 add 方法 fn add(self, rhs: Complex<T>) -> Self::Output

    第一个参数是 self,而不是&self,那是不是调用了比如 a + b 后,是不是 a 就失去了所有权,但代码测试还是能访问 a 和 b 的。
    xiaopanzi
        3
    xiaopanzi  
       2021-10-18 10:43:31 +08:00
    @hahaFck 肯定就失去所有权啊。贴一下测试代码看看。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   937 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 20:51 · PVG 04:51 · LAX 13:51 · JFK 16:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.