Правило сироты (orphan rule)
Правило Rust: реализовать трейт для типа можно, только если хотя бы одно из двух принадлежит вашему крейту. Источник примерно половины огорчений новичков в Rust.
Мотив — когерентность: компилятор гарантирует, что для каждой пары «трейт — тип» во всей программе существует ровно одна реализация. Без этого правила две независимые библиотеки могли бы реализовать один и тот же трейт сериализации для Vec, и в день, когда кто-то подключит обе в один бинарник, разумного выхода не будет — ни одна из библиотек этого не исправит. Цена — нельзя добавить поведение чужим типам, а именно этого и хочется. Устоявшийся обход — тонкая обёртка, делающая тип локальным, ценой потери унаследованных методов. Правило тоньше, чем звучит: параметры типов в некоторых позициях считаются покрытыми, а ссылки и Box помечены как прозрачные, чтобы смягчить худшие неудобства.