Ответ 1
Простой type Foo = Bar;
вне impl
определяет псевдоним типа и задокументировано в книге. Существует универсальная версия type Foo<T> =...
но если вы понимаете универсальные версии в общем, тогда это очевидное расширение.
type
в impl
определяет связанный тип. Они описаны в Книге, но я уже написал краткое резюме, так что вы тоже это получите:
Когда у вас есть такая черта, как " Add
, вы хотите абстрагироваться не только от того, какие типы вещей можно добавить, но также от типа их суммы. Добавление целых чисел приводит к целым числам, добавление чисел с плавающей точкой приводит к плавающим. Но вы не хотите, чтобы тип результата был параметром Add
как в Add<ThingToAdd, ResultType>
, по причинам, которые я здесь рассмотрю.
Следовательно, эта черта имеет тип, связанный с impl
. Для любой реализации Add
, например, impl Add<Foo> for Bar
, тип результата добавления уже определен. Это заявлено в черте как это:
trait Add<Rhs> {
type Result;
// ...
}
И тогда все реализации определяют тип их результата:
impl Add<Foo> for Bar {
type Result = BarPlusFoo;
// ...
}