работает.
не доходили руки потестировать. а оказалось)) этим и пользоватся то нельзя как это нам хотелось.
а вот где собака)
1. если не описывать этот type вообще, выходит это
error: could not find defining uses
--> src/lib.rs:3:1
|
3 | type TypeMyTrait = impl MyTrait;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: aborting due to previous error
error: could not compile `playground`.
2. ладно ок, опишем его для типа
#![feature(type_alias_impl_trait)]
pub type TypeMyTrait = impl MyTrait;
pub trait MyTrait {}
impl<A, T> MyTrait for (A, T) {}
pub fn empty() -> TypeMyTrait {
(0, 0)
}
все нормально так,
3. теперь реально начинаем использовать это
#![feature(type_alias_impl_trait)]
pub type TypeMyTrait = impl MyTrait;
pub trait MyTrait {}
impl<A, T> MyTrait for (A, T) {}
impl MyTrait for () {}
pub fn empty() -> TypeMyTrait {
(0, 0)
}
pub fn empty2() -> TypeMyTrait {
()
}
и хоба,
error: concrete type differs from previous defining opaque type use
--> src/lib.rs:13:1
|
13 | / pub fn empty2() -> TypeMyTrait {
14 | | ()
15 | | }
| |_^ expected `(i32, i32)`, got `()`
|
note: previous use here
--> src/lib.rs:9:1
|
9 | / pub fn empty() -> TypeMyTrait {
10 | | (0, 0)
11 | | }
| |_^
говорили от box избавит и от <T> ?:)
нет, просто один виртуальный тип (impl) на всю прогу будет действительно как тип, но один на один тип.
использовать можно, но узконаправленно.
https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=2f00075b6727d8b89897daa3fb485e3f
Так мы этого и хотели )
Обсуждают сегодня