Канал обсуждения книги и проблем перевода. Общие вопросы по языку, получение помощи - в https://gitter.im/ruRust/general
Здравствуйте! Помогите понять сиротское правило (orphan rule), о котором речь идет тут:
https://doc.rust-lang.ru/book/ch10-02-traits.html
В частности тут речь идет о сложности, которая дословно образуется так: "Без этого правила два крейта могли бы реализовать один типаж для одинакового типа и Rust не будет знать, какой реализацией пользоваться".
Я ищу объяснений проще, лучше на пальцах и лучше пальцев одной руки, по возможности.
Я в своем мозгу представил сложность так: оба крейта используют одинаковый тип и этот тип, видимо, как минимум для одного из этих крейтов является не локальным. А может для обоих крейтов этот тип внешний (из описания не ясно).
В одном из этих двух крейтов к внешнему для него типу захотели прикрутить типаж из второго крейта. Понятно что возник внешний тип и внешний типаж. И сиротское правило это не благословляет. Но путаница не ясна.
Ведь кажется что при реализации типажа ошибка исключена. Будет четко стоять что-то типа "use (...путь к крейту...)::{Summary};", что в прозрачной форме как бы говорит, что второй крейт хочет прикрутить к внешнему типу конкретно этот типаж (пусть и внешний) и он указан вроде бы как четко, без путаницы.
Что я упускаю? Мой пример почему-то не иллюстрирует проблемы... и я не могу ее понять.
я, если честно, не могу толком твой пример выше распарсить.
в моей картине мира пример потенциальных сиротских неприятностей выглядит так:
a
с типажом trait A { fn a(&self) -> u8; }
b
с типом struct B;
c
, который реализовал сироту impl A for B { fn a(&self) -> u8 { 0 } }
d
, который реализовал сироту impl A for B { fn a(&self) -> u8 { 1 } }
если в итоговом проекте окажутеся c
и d
крейты, то при вызове B.a()
появляется неоднозначность какая из реализаций должна использоваться и в языке нет способа ее разрешить.
B.a()
вызов может быть не в коде непосредственного нашего проекта, а где-то в наших зависимостях с crates.io - тогда даже если бы в языке был способ выбирать реализацию, у нас не было бы возможности просто так взять и поправить этот код.