< 返回版块

Mercury 发表于 2021-12-09 15:12

今天在啃futures这个crate,发现这样一段针对标准Future扩展的源码:

impl<T: ?Sized> FutureExt for T where T: Future {}

因为在很多crate里面也见到过类似T: ?Sized的情况,想问下在这里的?操作符代表啥意思?

为啥不能用下面这种方式呢?

impl<T> FutureExt for T where T: Future + Sized {}

而且看api文档,似乎只有Sized这个trait会用到这种特殊语法,但std文档中的解释并不能理解。有大佬能帮忙用比较浅显点的语言来解释下这样做的目的和用途么?多谢。

All type parameters have an implicit bound of Sized. The special syntax ?Sized can be used to remove this bound if it’s not appropriate.

评论区

写评论
向離 2021-12-10 14:13

学到了

作者 Mercury 2021-12-09 15:58

多谢,了解了。 又细看了下std的例子,?Sized的确如所说,是用于不确定大小的类型。

--
👇
7sDream: opt-out,目前应该只有 Sized 这个 Trait 能这么写,因为编译器对所有泛型参数都默认加上了这个 Sized Trait 的限制,所以提供了 ?Sized 来去掉这个限制。

至于为什么要加上,因为这个限制太普遍了,相比对于 99.9% 的 Case 让人手动加这个限制,不如让那 0.1% 的 Case 手动去掉来的简洁。

至于为什么 Sized Trait 这么普遍,那就是另一个话题了。简单来说就是编译器在生成函数调用的代码时需要知道栈的大小。

7sDream 2021-12-09 15:20

opt-out,目前应该只有 Sized 这个 Trait 能这么写,因为编译器对所有泛型参数都默认加上了这个 Sized Trait 的限制,所以提供了 ?Sized 来去掉这个限制。

至于为什么要加上,因为这个限制太普遍了,相比对于 99.9% 的 Case 让人手动加这个限制,不如让那 0.1% 的 Case 手动去掉来的简洁。

至于为什么 Sized Trait 这么普遍,那就是另一个话题了。简单来说就是编译器在生成函数调用的代码时需要知道栈的大小。

1 共 3 条评论, 1 页