выбирает конкретный тип. Существует некоторый тип, который «существует» и реализует черту, которая будет возвращена функцией.

алRFC о "расширяющемся" значении когда я наткнулся на следующее:

В отличие от программиста, который впервые узнал:fn take_iter(t: impl Iterator) а потом попробовал:fn give_iter() -> impl Iterator будет успешным, без какого-либо строгого понимания, что они просто перешли от универсального к экзистенциальному.

Хотя я понимаю, что универсальное против экзистенциального с логической точки зрения, что делает первое выше универсальным, а второе экзистенциальным?

 Peter Hall29 июл. 2018 г., 12:12
@interjay Типичным примером универсально определенного типа возвращаемого значения являетсяInto::into(), Вызывающая сторона предоставляет тип, который они хотят получить обратно (обычно путем логического вывода).
 interjay21 дек. 2017 г., 18:36
Он был выбран для работы таким образом, потому что это наиболее распространенные варианты использования. Также есть случаи, когда бы существующий тип аргумента или универсальный тип возвращаемого значения были бы полезны, но они относительно редки, поэтому RFC решил не реализовывать их и сохранять простоту.

Ответы на вопрос(1)

между экзистенциальными типами (где вызываемый выбирает тип) и универсальными типами (где выбирающий вызывающий)

Было много дискуссий об универсалиях и экзистенциалах (в сегодняшнем Rust дженерики vs impl Trait).

Универсальное количественное определение, то есть «для любого типа Т», то есть «вызывающий абонент выбирает». Вот как сегодня работают дженерики. Когда ты пишешьfn foo<T>(t: T)Вы говорите, что функция будет работать для любого выбораTи оставив звонящему выбратьT.

Экзистенциальное количественное определение, то есть «для некоторого типа Т», то есть «выбираемый вызываемый абонент». Вот какimpl Trait работает сегодня (только в обратной позиции). Когда ты пишешьfn foo() -> impl Iterator, вы говорите, что функция будет производить какой-то типT который реализуетIterator, но вызывающему не разрешается предполагать что-либо еще об этом типе.

TL; DR:

fn take_iter(t: impl Iterator) - человек, звонящийtake_iter выбирает конкретный тип. Функция должна работать для всей "вселенной" типов, которые реализуют эту черту.

fn give_iter() -> impl Iterator - реализацияgive_iter выбирает конкретный тип. Существует некоторый тип, который «существует» и реализует черту, которая будет возвращена функцией.

Ваш ответ на вопрос