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

Rust 使用泛型作为返回值的问题

  •  
  •   xiaopanzi · 2021-05-07 17:09:04 +08:00 · 1791 次点击
    这是一个创建于 1321 天前的主题,其中的信息可能已经有所发展或是发生改变。

    参考The Book的例子,有一个疑问,impl Summary作为返回值是否是一种语法糖?

    我试着这样写:

    pub fn test_return<T: Summary>() -> T {
        Tweet {
            username: String::from("Jim"),
            content: String::from("learning trait"),
            reply: false,
            retweet: true,
        }
    }
    

    但是,编译通不过:expected type parameter T, found struct Tweet。所以上述的写法和直接返回impl Summary的区别到底是什么?

    3 条回复    2021-05-11 07:38:13 +08:00
    sosilver
        1
    sosilver  
       2021-05-07 18:19:46 +08:00 via Android
    泛型参数是由 caller 决定的,所以函数里没法返回 concrete type ( Tweet 不是 T )。返回位的 impl Trait 类型,由函数实现决定,只是不写出来(可能写不出来)。
    h404bi
        2
    h404bi  
       2021-05-07 18:35:40 +08:00
    写成 pub fn test_return<T: Summary>() -> T;,caller 就能假定可以 test_return::<NonTweet>() -> NonTweet (假设 NonTweet 实现了 Summary )这样调用了,但实际上函数内只返回 Tweet 了,不是 generic 。

    返回位这里的 impl Trait 实际上是一个 Existential type,跟写成 T 的 Generic type 不同。
    abscon
        3
    abscon  
       2021-05-11 07:38:13 +08:00 via iPhone
    参数里的 impl Trait 是语法糖,但返回值里的 impl Trait 不是语法糖
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1867 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 16:19 · PVG 00:19 · LAX 08:19 · JFK 11:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.