Size: a a a

Rust — русскоговорящее сообществo

2020 April 02

d

defuz in Rust — русскоговорящее сообществo
Berkus Decker
А по делу - разница между трейтами и интерфейсами (как уже написано выше) в том что от трейтов не надо наследоваться и имплементировать трейт можно для стороннего класса
Но вообще от трейтов можно наследовать другие трейты, и это касается не только API, но и реализации. Английская Вики вроде бы пытается объяснить что концептуально трейты - это объединение интерфейсов и миксинов в одну сущность. Вроде бы звучит логично
источник

BD

Berkus Decker in Rust — русскоговорящее сообществo
defuz
Но вообще от трейтов можно наследовать другие трейты, и это касается не только API, но и реализации. Английская Вики вроде бы пытается объяснить что концептуально трейты - это объединение интерфейсов и миксинов в одну сущность. Вроде бы звучит логично
наследование внутри трейтов это дело самих трейтов, я про необходимость добавлять implements Interface к тому классу для которого ты вдруг решил реализовать интерфейс
источник

BD

Berkus Decker in Rust — русскоговорящее сообществo
(это требует модифицировать 3rd party code, что обычно малореально)
источник

d

defuz in Rust — русскоговорящее сообществo
Все так, но то о чем ты говоришь - это миксины. В C# это называется “extension methods” если я правильно помню. Проблема в том что они не являются интерфейсами, то есть расширять можно, а абстрагировать - нельзя
источник

🦉⁣

🦉 ⁣ in Rust — русскоговорящее сообществo
Andrey @ozkriff Lesnikov
не, на практике кроме самого lsp еще нюансы есть все-таки
эх жаль
источник

BD

Berkus Decker in Rust — русскоговорящее сообществo
defuz
Все так, но то о чем ты говоришь - это миксины. В C# это называется “extension methods” если я правильно помню. Проблема в том что они не являются интерфейсами, то есть расширять можно, а абстрагировать - нельзя
extension methods не обязаны конформить какому-то интерфейсу, миксины это вполне нормальное слово - не вижу в этом ничего плохого, трейты в чем-то похожи на них
источник

BV

Boris Vinogradov in Rust — русскоговорящее сообществo
defuz
Все так, но то о чем ты говоришь - это миксины. В C# это называется “extension methods” если я правильно помню. Проблема в том что они не являются интерфейсами, то есть расширять можно, а абстрагировать - нельзя
в отличие от до-диез в раст нельзя расширять, что прям местами доставляет некоторое неудобство
источник

d

defuz in Rust — русскоговорящее сообществo
Boris Vinogradov
в отличие от до-диез в раст нельзя расширять, что прям местами доставляет некоторое неудобство
Так можно, просто для этого нужно объявить новый трейт. Можно себе представить что введут понятие «anonymous trait”, который можно реализовать, но нельзя назвать (как и анонимные лямбды). Тогда будет тоже самое что extension methods
источник

BD

Berkus Decker in Rust — русскоговорящее сообществo
defuz
Так можно, просто для этого нужно объявить новый трейт. Можно себе представить что введут понятие «anonymous trait”, который можно реализовать, но нельзя назвать (как и анонимные лямбды). Тогда будет тоже самое что extension methods
он про extension methods
источник

ШН

Шерзод Немножко Токсик in Rust — русскоговорящее сообществo
defuz
Так можно, просто для этого нужно объявить новый трейт. Можно себе представить что введут понятие «anonymous trait”, который можно реализовать, но нельзя назвать (как и анонимные лямбды). Тогда будет тоже самое что extension methods
Go?
источник

BV

Boris Vinogradov in Rust — русскоговорящее сообществo
defuz
Так можно, просто для этого нужно объявить новый трейт. Можно себе представить что введут понятие «anonymous trait”, который можно реализовать, но нельзя назвать (как и анонимные лямбды). Тогда будет тоже самое что extension methods
ты когда вводишь новый трейт ты можешь ему добавить свойств но для зависимости всё равно надо указывать предыдущий трейт и его реализовывать, т.е. не полностью прозрачная схема получается
источник

BV

Boris Vinogradov in Rust — русскоговорящее сообществo
плюс у тебя нет апкастинга даже, что добавляет ещё немного боли
источник

BV

Boris Vinogradov in Rust — русскоговорящее сообществo
И тут я согласен что это прям вот миксин, но не интерфейс в привычном виде
источник

АГ

Алексей Герасимов in Rust — русскоговорящее сообществo
defuz
Так можно, просто для этого нужно объявить новый трейт. Можно себе представить что введут понятие «anonymous trait”, который можно реализовать, но нельзя назвать (как и анонимные лямбды). Тогда будет тоже самое что extension methods
нельзя потому что в шарпе ты расширяешь конкретный класс, а в расте трейт не знает кто будет его имплементить поэтому не может использовать методы конкретного типа
источник

d

defuz in Rust — русскоговорящее сообществo
Алексей Герасимов
нельзя потому что в шарпе ты расширяешь конкретный класс, а в расте трейт не знает кто будет его имплементить поэтому не может использовать методы конкретного типа
Может, потому что я говорю о гипотетической возможности, в которой не нужно объявлять трейт, но можно сразу его имплементировать. Что-то типа impl _ for Foo {}
источник

🦉⁣

🦉 ⁣ in Rust — русскоговорящее сообществo
defuz
Может, потому что я говорю о гипотетической возможности, в которой не нужно объявлять трейт, но можно сразу его имплементировать. Что-то типа impl _ for Foo {}
и зачем?

чем это отличается от impl Foo {}?
источник

🦉⁣

🦉 ⁣ in Rust — русскоговорящее сообществo
ведь суть трейта в переиспользовании
источник

АГ

Алексей Герасимов in Rust — русскоговорящее сообществo
defuz
Может, потому что я говорю о гипотетической возможности, в которой не нужно объявлять трейт, но можно сразу его имплементировать. Что-то типа impl _ for Foo {}
тогда это будет не трейт а как-бы impl сбоку
источник

d

defuz in Rust — русскоговорящее сообществo
🦉 ⁣
и зачем?

чем это отличается от impl Foo {}?
Тем что ты можешь сделать это в любом крейте
источник

BV

Boris Vinogradov in Rust — русскоговорящее сообществo
🦉 ⁣
и зачем?

чем это отличается от impl Foo {}?
Object object
источник