История изменений
Исправление tailgunner, (текущая версия) :
Но разве когда мы в программе пишем:
extern crate baz;
extern crate bletch;
Tо компилятор не может увидеть, что у нас имена символов совпадают?
В этом конкретном случае - может быть. А если у нас используется динамическая загрузка в стиле dlsym? Или при запуске используется более новая версия крейта, чем при компиляции? Как подобный конфликт обходит предлагаемое тобой решение?
Например, так:
extern crate baz;
extern crate bletch;
// Переименовываем.
use baz::foo::FooTrait as BazFooTrait;
use bletch::foo::FooTrait as BletchFooTrait;
Кхм. Нет никакого baz::foo::FooTrait (baz::FooTrait тоже нет); в baz есть некая реализация foo::FooTrait для bar::Bar, у этой реализации даже имени нет (?).
Кроме того, допустим, у тебя есть крейт bzz, который использует baz, и boo, который использует bletch; ты используешь оба крейта; чтобы жизнь малиной не казалась, оба крейта без исходников. Какую реализацию foo::FooTrait для bar::Bar будет использовать каждый крейт?
Ну серьёзно - вот у нас сейчас в проекте сериализация из одной либы успешно работает с типами из другой. Обе либы не наши.
Если автор bar сам не позаботился о реализации FooTrait для bar::Bar, то newtype MyBar, impl FooTrait for MyBar, и у тебя есть юзабельная реализация FooTrait. Да, ты не сможешь передать bar::Bar туда, где требуется foo::FooTrait, но селяви. В Си++ ты бы создал класс, производный от foo::FooTrait, и содержащий (указатель на) bar::Bar, с той же проблемой, не?
Исправление tailgunner, :
Но разве когда мы в программе пишем:
extern crate baz;
extern crate bletch;
Tо компилятор не может увидеть, что у нас имена символов совпадают?
В этом конкретном случае - может быть. А если у нас используется динамическая загрузка в стиле dlsym? Или при запуске используется более новая версия крейта, чем при компиляции? Как подобный конфликт обходит предлагаемое тобой решение?
Например, так:
extern crate baz;
extern crate bletch;
// Переименовываем.
use baz::foo::FooTrait as BazFooTrait;
use bletch::foo::FooTrait as BletchFooTrait;
Кхм. Нет никакого baz::foo::FooTrait (baz::FooTrait тоже нет); в baz есть некая реализация FooTrait для bar::Bar, у этой реализации даже имени нет (?).
Кроме того, допустим, у тебя есть крейт bzz, который использует baz, и boo, который использует bletch; ты используешь оба крейта; чтобы жизнь малиной не казалась, оба крейта без исходников. Какую реализацию foo::FooTrait для bar::Bar будет использовать каждый крейт?
Ну серьёзно - вот у нас сейчас в проекте сериализация из одной либы успешно работает с типами из другой. Обе либы не наши.
Если автор bar сам не позаботился о реализации FooTrait для bar::Bar, то newtype MyBar, impl FooTrait for MyBar, и у тебя есть юзабельная реализация FooTrait. Да, ты не сможешь передать bar::Bar туда, где требуется foo::FooTrait, но селяви. В Си++ ты бы создал класс, производный от foo::FooTrait, и содержащий (указатель на) bar::Bar, с той же проблемой, не?
Исходная версия tailgunner, :
Но разве когда мы в программе пишем:
extern crate baz;
extern crate bletch;
Tо компилятор не может увидеть, что у нас имена символов совпадают?
В этом конкретном случае - может быть. А если у нас используется динамическая загрузка в стиле dlsym? Или при запуске используется более новая версия крейта, чем при компиляции? Как подобный конфликт обходит предлагаемое тобой решение?
Например, так:
extern crate baz;
extern crate bletch;
// Переименовываем.
use baz::foo::FooTrait as BazFooTrait;
use bletch::foo::FooTrait as BletchFooTrait;
Кхм. Нет никакого baz::foo::FooTrait (baz::FooTrait тоже нет); в baz есть некая реализация FooTrait для bar::Bar, у этой реализации даже имени нет (?).
Кроме того, допустим, у тебя есть крейт bzz, который использует baz, и boo, который использует bletch; ты используешь оба крейта; чтобы жизнь малиной не казалась, оба крейта без исходников. Какую реализацию foo::FooTrait для bar::Bar будет использовать каждый крейт?
Ну серьёзно - вот у нас сейчас в проекте сериализация из одной либы успешно работает с типами из другой. Обе либы не наши.
Если автор bar сам не позаботился о реализации FooTrait для bar::Bar, то newtype MyBar, impl FooTrait for MyBar, и у тебя есть юзабельная реализация FooTrait. Да, ты не сможешь передать bar::Bar туда, где требуется foo::FooTrait, но селяви. В Си++ ты бы создал класс, производный от foo::FooTrait, и содержащий (указатель на) bar::Bar, с той же проблемой, не?