LINUX.ORG.RU

История изменений

Исправление 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, с той же проблемой, не?