3 existential-type universal rust
当我发现以下内容时,我正在阅读关于"扩展"impl Trait的RFC:
相比之下,一个程序员首先学习:
fn take_iter(t: impl Iterator)然后尝试:fn give_iter() -> impl Iterator将会成功,没有任何严格的理解,他们只是从普遍性转变为存在性.
虽然我从逻辑的角度理解普遍与存在的关系,但是第一个是普遍的还是第二个存在的?
RFC以多种方式多次定义术语:
存在类型(被调用者选择类型)和通用类型(调用者选择的位置)之间
关于普遍性与存在性的讨论很多(在今天的Rust,generics vs impl Trait中).
通用量化,即"对于任何类型T",即"呼叫者选择".这就是仿制药今天的工作方式.当你写作时
fn foo<T>(t: T),你说这个功能适用于任何选择T,并留给你的来电者选择T.存在量化,即"对于某些类型T",即"被调用者选择".这就是
impl Trait今天的工作方式(仅在返回位置).当你写的时候fn foo() -> impl Iterator,你说这个函数会产生一些T实现的 类型Iterator,但不允许调用者假设有关该类型的任何其他内容.
TL; DR:
fn take_iter(t: impl Iterator)- 打电话的人take_iter选择具体类型.该函数必须适用于实现特征的整个"Universe"类型.
fn give_iter() -> impl Iterator- 执行give_iter挑选具体类型.有一些类型"存在"并实现将由函数返回的特征.