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

2021-05-07 17:09:04 +08:00
 xiaopanzi

参考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的区别到底是什么?

1595 次点击
所在节点    Rust
3 条回复
sosilver
2021-05-07 18:19:46 +08:00
泛型参数是由 caller 决定的,所以函数里没法返回 concrete type ( Tweet 不是 T )。返回位的 impl Trait 类型,由函数实现决定,只是不写出来(可能写不出来)。
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
2021-05-11 07:38:13 +08:00
参数里的 impl Trait 是语法糖,但返回值里的 impl Trait 不是语法糖

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

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

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

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

© 2021 V2EX