История изменений
Исправление red75prim, (текущая версия) :
Трейты это не типы, это - классы типов. fn foo(_: Foo1) -> Foo2
и fn bar(_: impl Bar1) -> impl Bar2
пишутся по разному, потому что означают совершенно разные вещи.
Первое - это просто функция Foo1 -> Foo2, второе - дженерик функция, принимающая значение любого типа реализующего трейт Bar1 и возвращающая экзистенциальный тип, реализующий трейт Bar2.
То есть вторая функция это на самом деле fn bar<T: Bar1>(_: T) -> impl Bar2
Лучше сразу видеть по сигнатуре с чем имеем дело, чем вспоминать что такое Foo1 - тип или трейт.
Ну и ещё есть dyn Trait - трейт-объект, используемый для динамической диспетчеризации. Раньше было позволено dyn не писать и fn f(x: &Foo)
означало fn f(x: &dyn Foo)
(а, не &impl Foo
), если Foo - это трейт.
Насчёт правил когерентности, запрещающих писать реализации чужих трейтов для чужих типов - это долгий разговор. Можно кое-что почитать тут https://github.com/Ixrec/rust-orphan-rules
Вкратце: предпочли меньше поломок зависимостей при обновлении библиотек.
Ключевого слова fun в расте нет.
Исходная версия red75prim, :
Трейты это не типы, это - классы типов. fn foo(: Foo1) -> Foo2 и fn bar(: impl Bar1) -> impl Bar2 пишутся по разному, потому что означают совершенно разные вещи.
Первое - это просто функция Foo1 -> Foo2, второе - дженерик функция, принимающая значение любого типа реализующего трейт Bar1 и возвращающая экзистенциальный тип, реализующий трейт Bar2.
То есть вторая функция это на самом деле fn bar<T: Bar1>(_: T) -> impl Bar2
Лучше сразу видеть по сигнатуре с чем имеем дело, чем вспоминать что такое Foo1 - тип или трейт.
Ну и ещё есть dyn Trait - трейт-объект, используемый для динамической диспетчеризации. Раньше было позволено dyn не писать и fn f(x: &Foo) означало fn f(x: &dyn Foo) (а, не &impl Foo), если Foo - это трейт.
Насчёт правил когерентности, запрещающих писать реализации чужих трейтов для чужих типов - это долгий разговор. Можно кое-что почитать тут https://github.com/Ixrec/rust-orphan-rules
Вкратце: предпочли меньше поломок зависимостей при обновлении библиотек.
Ключевого слова fun в расте нет.