Rust 是什么让“impl Trait”成为论点;环球公司;和作为返回值“;存在的;?
我正在读这本书,突然发现: 相比之下,一个首先学会了:Rust 是什么让“impl Trait”成为论点;环球公司;和作为返回值“;存在的;?,rust,universal,existential-type,Rust,Universal,Existential Type,我正在读这本书,突然发现: 相比之下,一个首先学会了:fn的程序员接受了(t:impl 迭代器)然后尝试:fn give_iter()->impl迭代器 成功,没有任何严格的理解,他们只是 从普遍的到存在的转变 虽然我从逻辑的角度理解了普遍性与存在性,但是什么使得上面的第一个是普遍的,第二个是存在的?RFC以多种方式多次定义术语: 在存在类型(被调用方选择类型)和通用类型(调用方选择类型)之间 关于普遍性与存在主义(在今天的Rust中,泛型与impl-Trait)有很多讨论 通用量化,即“任何
fn的程序员接受了(t:impl
迭代器)
然后尝试:fn give_iter()->impl迭代器
成功,没有任何严格的理解,他们只是
从普遍的到存在的转变
虽然我从逻辑的角度理解了普遍性与存在性,但是什么使得上面的第一个是普遍的,第二个是存在的?RFC以多种方式多次定义术语:
在存在类型(被调用方选择类型)和通用类型(调用方选择类型)之间
关于普遍性与存在主义(在今天的Rust中,泛型与impl-Trait)有很多讨论
- 通用量化,即“任何类型的T”,即“调用者”
选择”。这就是今天泛型的工作原理。当你写作时
fn foo(t:t)
,您的意思是该函数将适用于任何
选择T
,并让调用者选择T
- 存在量化,即“某些类型的T”,即“被调用者”
选择”。这就是
impl Trait
今天的工作方式(作为回报
仅限位置)。当您编写fn foo()->impl迭代器时
表示该函数将生成某种类型的T
,该类型实现
迭代器
,但不允许调用方假定任何其他内容
关于那种类型
TL;博士:
fn take iter(t:impl迭代器)
-调用take iter
的人选择具体类型。该函数必须适用于实现该特性的整个“宇宙”类型
fn give_iter()->impl迭代器
-give_iter的实现选择具体类型。有一些类型“存在”并实现了将由函数返回的特征
之所以选择这种方式,是因为这些是最常见的用例。也有一些情况下,存在参数类型或通用返回类型是有用的,但这些情况相对较少,因此RFC选择不实现它们并保持简单。@interjay普遍量化的返回类型的一个常见示例是Into::Into()
。调用者提供他们想要返回的类型(通常通过推断)。