Size: a a a

2020 October 28

MB

Mikail Bagishov in Rust Beginners
Потому что у одного типа может получиться несколько имплементаций Trait
источник

JC

Julian =) Coffee in Rust Beginners
Я не совсем понял, как это может получится
источник

JC

Julian =) Coffee in Rust Beginners
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=79368341266ce187bcc6678db49108e7
Так тоже не работает, если убрать пятую строчку из примера выше
источник

MB

Mikail Bagishov in Rust Beginners
Julian =) Coffee
Я не совсем понял, как это может получится
impl ExampleTraitWith<i32> for () {}
impl ExampleTraitWith<u32> for () {}
источник

MB

Mikail Bagishov in Rust Beginners
Оба попытаются превратиться в impl Trait for ()
источник

JC

Julian =) Coffee in Rust Beginners
а
источник

JC

Julian =) Coffee in Rust Beginners
теперь понял
источник

N

N in Rust Beginners
Mikail Bagishov
Оба попытаются превратиться в impl Trait for ()
то есть нельзя чтобы трейт был дважды имплементирован для какого-то типа, даже если у имплементаций разные параметры?
источник

MB

Mikail Bagishov in Rust Beginners
Конкретный трейт для конкретного типа больше одного раза реализовывать нельзя. Как иначе компилятор должен выбирать конкретную реализацию?
источник

N

N in Rust Beginners
Mikail Bagishov
Конкретный трейт для конкретного типа больше одного раза реализовывать нельзя. Как иначе компилятор должен выбирать конкретную реализацию?
но так же можно
источник

MB

Mikail Bagishov in Rust Beginners
Тут трейты разные.

Add нужно трактовать не как трейт, а как шаблон трейта.
источник

N

N in Rust Beginners
Mikail Bagishov
Тут трейты разные.

Add нужно трактовать не как трейт, а как шаблон трейта.
то есть Add особенный?
источник

MB

Mikail Bagishov in Rust Beginners
N
то есть Add особенный?
Нет, это относится к любому дженерик трейту. И то же самое с дженерик функциями (это не функции а шаблоны функций), дженерик структурами (это шаблоны структур) и так далее
источник

JC

Julian =) Coffee in Rust Beginners
Add<Vector> и Add<Number> это разные вещи
источник

MB

Mikail Bagishov in Rust Beginners
Пример из математики.
2 - число,
3+5 - число,
sin(7) - число

А sin - не числа, а функция (шаблон числа).
источник

N

N in Rust Beginners
Mikail Bagishov
impl ExampleTraitWith<i32> for () {}
impl ExampleTraitWith<u32> for () {}
ExampleTraitWith<i32> и ExampleTraitWith<u32> ведь настолько же разные вещи
источник

JC

Julian =) Coffee in Rust Beginners
Да, и так можно
источник

JC

Julian =) Coffee in Rust Beginners
Mikail Bagishov
Оба попытаются превратиться в impl Trait for ()
Но нельзя вот это
источник

MB

Mikail Bagishov in Rust Beginners
N
ExampleTraitWith<i32> и ExampleTraitWith<u32> ведь настолько же разные вещи
Да, конечно.

Но дальше бланкет импл (impl<E, T: With<E> > Trait for T) пытается из каждой из них вывести impl Trait for (), и получается конфликт
источник

MB

Mikail Bagishov in Rust Beginners
А раст такое хочет предотвращать и поэтому запрещает такие "опасные" имплементации
источник