LINUX.ORG.RU

История изменений

Исправление anonymous-angler, (текущая версия) :

В позиции параметра эти две конструкции эквивалентны:

fn foo<T: Bar>(t: T) {
    /*...*/
}

fn foo(t: impl Bar) {
    /*...*/
}

Так сделали не от большого ума, а потому что кто-то предложил «за компанию добавить и в параметры». ИМХО, зря.

В первую очередь это ввели для случая с возвращаемым значением. Если конкретно: потому что замыкание имеет конкретный тип, но ты его не можешь назвать:

fn foo(a: i32) -> /* ??? */ {
    move |x: i32| a * x
}

impl существует скорее всего из-за семантики:

  • dyn Trait - что угодно, безразмерное.
  • impl trait - что-то одно, конкретное, размерное.

А просто Trait - это класс типпов, а не тип, поэтому возвращать его - какой-то нонсенс.

Исходная версия anonymous-angler, :

В позиции параметра эти две конструкции эквивалентны:

fn foo<T: Bar>(t: T) {
    /*...*/
}

fn foo(t: impl Bar) {
    /*...*/
}

Так сделали не от большого ума, а потому что кто-то предложил «за компанию добавить и в параметры». ИМХО, зря.

В первую очередь это ввели для случая с возвращаемым значением. Если конкретно: потому что замыкание имеет конкретный тип, но ты его не можешь назвать:

fn foo(a: i32) -> /* ??? */ {
    move |x: i32| a * x
}

impl существует скорее всего из-за семантики:

  • dyn Trait - что угодно, безразмерное.
  • impl trait - что-то одно, конкретное.

А просто Trait - это класс типпов, а не тип, поэтому возвращать его - какой-то нонсенс.