LINUX.ORG.RU

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

Исправление tailgunner, (текущая версия) :

Я тебя очень часто не понимаю. Иногда даже кажется, что ты троллишь.

Примерно то же самое мне кажется сейчас. В описании проблемы стоит «трейт для типа может быть реализован только в модуле, в котором определен трейт либо тип», а ты упорно говоришь «но я же могу создать у себя трейт с тем же именем и реализовать его».

можно ведь не компилировать с неоднозначностью, благо она детектится легко (так ведь?)

На этапе компиляции? Вообще не детектится. Представь, что на одном краю земли Алиса сделала крейт foo с трейтом foo::FooTrait; на другом Боб сделал крейт bar с типом bar::Bar; на третьем краю Чарли реализовал foo::FooTrait для bar::Bar в крейте baz; на четвертом краю Дэвид реализовал foo::FooTrait для bar::Bar в крейте bletch. Теперь крейты baz и bletch встретились в одной программе, которая пытается использовать методы FooTrait на объекте типа Bar. Мы имеем конфликт между крейтами baz и bletch, поскольку они оба несут реализацию foo::FooTrait для bar::Bar. Как здесь поможет _компилятор_? Линковщик - может быть, но компилятор? Конфликтующие крейты изготовили Чарли и Дэвид, которые не знали друг о друге. Как подобный конфликт обходит предлагаемое тобой решение?

Исправление tailgunner, :

Я тебя очень часто не понимаю. Иногда даже кажется, что ты троллишь.

Примерно то же самое мне кажется сейчас. В описании проблемы стоит «трейт для типа может быть реализован только в модуле, в котором определен трейт либо тип», а ты упорно говоришь «но я же могу создать у себя трейт с тем же именем и реализовать его».

можно ведь не компилировать с неоднозначностью, благо она детектится легко (так ведь?)

На этапе компиляции? Вообще не детектится. Представь, что на одном краю земли Алиса сделала крейт foo с трейтом foo::FooTrait; на другом Боб сделал крейт bar с типом bar::Bar; на третьем краю Чарли реализовал foo::FooTrait для bar::Bar в крейте baz; на четвертом краю Дэвид реализовал foo::FooTrait для bar::Bar в крейте bletch. Теперь крейты baz и bletch встретились в одной программе, которая пытается использовать методы FooTrait на объекте типа Bar. Мы имеем конфликт между крейтами baz и bletch, поскольку они оба несут реализацию foo::FooTrait для bar::Bar. Как здесь поможет _компилятор_? Линковщик - может быть, но компилятор? Конфликтующие крейты изготовили Чарли и Дэвид, которые не знали друг о друге. Как подобный конфликт обходит предлагаемое тобой решение?

Исходная версия tailgunner, :

Я тебя очень часто не понимаю. Иногда даже кажется, что ты троллишь.

Примерно то же самое мне кажется сейчас. В описании проблемы стоит «трейт для типа может быть реализован только в модуле, в котором определен трейт либо тип», а ты упорно говоришь «но я же могу создать у себя трейт с тем же именем и реализовать его».

можно ведь не компилировать с неоднозначностью, благо она детектится легко (так ведь?)

На этапе компиляции? Вообще не детектится. Представь, что на одном краю земли Алиса сделала крейт foo с трейтом foo::FooTrait; на другом Боб сделал крейт bar с типом bar::Bar; на третьем краю Чарли реализовал foo::FooTrait для bar::Bar в крейте baz; на четвертом краю Дэвид реализовал foo::FooTrait для bar::Bar в крейте bletch. Теперь крейты baz и bletch встретились в одной программе, которая пытается использовать методы FooTrait на объекте типа Bar. Мы имеем конфликт между крейтами baz и bletch, поскольку они оба несут реализацию foo::FooTrait для bar::Bar. Как здесь поможет _компилятор_? Линковщик - может быть, но компилятор? Конфликтующие крейты изготовили Чарли и Дэвид, кот орые не знали друг о друге. Как подобный конфликт обходит предлагаемое тобой решение?