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()
。调用者提供他们想要返回的类型(通常通过推断)。