Size: a a a

2020 March 03

V

Vabka in rust_offtopic
Alex Zhukovsky
то есть в коллстеке из 10 функций у нас 1024 варианта кто как кого зовет, я правильно тебя понял?
чего?
источник

V

Vabka in rust_offtopic
вариант у нас только 1 у нас же статическая типизация
источник

AZ

Alex Zhukovsky in rust_offtopic
Vabka
чего?
как солвер будет выбирать подходящие функции? Особенно если у нас еще перегрузка функций возможна то ваще пипец
источник

p

polunin.ai in rust_offtopic
Doge Shibu
Как пример - сериализация без рефлексии. Делаешь трейт:
trait MySerialization {
 fn serialize(&self) -> Vec<u8>
}


Ты хочешь обьявить такую свою абстракцию для примитивных типов и типов из стандратной библиотеки.

И в случае интерфейсов тебе бы пришлось городить адаптеры, чтобы такой дизайн работал, либо делать решение через рефлексию, где теряются компайл-тайм проверки того, что данный тип можно сериализовать.

А в случае тайпклассов - оно работает из коробки, т.к. ты можешь реализовать свои тайпклассы для чужих типов.

Поэтому библиотеки на тайпклассах получаются более модульными и удобными для конечного пользователя без потерь в типобезопасности.
То есть разница между интерфейсом и типажем что первый нельзя реализовывать для чужих типов?
источник

p

polunin.ai in rust_offtopic
Лол
источник

p

polunin.ai in rust_offtopic
А что такое "чужой" тип в шарпе?
источник

EG

Emmanuel Goldstein in rust_offtopic
И ещё есть протоколы, которые умеет проверять mypy
источник

AZ

Alex Zhukovsky in rust_offtopic
polunin.ai
А что такое "чужой" тип в шарпе?
интерфейсы можно реализовывать только в объявлении типа, трейты - в других местах
источник

EG

Emmanuel Goldstein in rust_offtopic
Это уже структурная типизация, как интерфейсы в го
источник

AZ

Alex Zhukovsky in rust_offtopic
polunin.ai
То есть разница между интерфейсом и типажем что первый нельзя реализовывать для чужих типов?
чтобы было понятно - схожим образом работают атрибуты в расте. Ты не можешь повесить свой атрибут на чужую структуру, на Vec например
источник

DS

Doge Shibu in rust_offtopic
polunin.ai
То есть разница между интерфейсом и типажем что первый нельзя реализовывать для чужих типов?
Не только.

У тайпклассов ещё есть механизм через который автоматически прокидываются инстансы в друг друга.

А-ля, если есть реализация MyTrait для типа X и impl <T: MyTrait > MyTrait for Option<T>, то методы тайпклассы автоматически будут доступны и у Option<X>
источник

V

Vabka in rust_offtopic
Alex Zhukovsky
как солвер будет выбирать подходящие функции? Особенно если у нас еще перегрузка функций возможна то ваще пипец
будет выбирать ту функцию, которая лучше всего подходит. Тоесть если у объекта
o: {
 f: ()->()
 f: ()->()&u32->()
 f<T>: ()->T
}
и мы вызываем
let unit: () = o.f(), то будет вызвана первая функция, тк она имеет самый узкий тип (хотя вторая и третья тоже подходят по сигнатуре), попутно тебе компилятор засрёт всё ворингами, тк вторая функция никогда не будет вызвана с параметром по-умолчанию
источник

p

polunin.ai in rust_offtopic
Alex Zhukovsky
интерфейсы можно реализовывать только в объявлении типа, трейты - в других местах
Пока не вижу между ними принципиальных различий еще
источник

p

polunin.ai in rust_offtopic
Типажи улучшенная версия интерфейсов
источник

λ

λоλторт in rust_offtopic
polunin.ai
То есть разница между интерфейсом и типажем что первый нельзя реализовывать для чужих типов?
Тайпклассы выгодно отличается от модулей, а значит и от классов и интерфейсов в оопе, тем что в языках с ними есть для них автоматический солвер.
источник

AZ

Alex Zhukovsky in rust_offtopic
Vabka
будет выбирать ту функцию, которая лучше всего подходит. Тоесть если у объекта
o: {
 f: ()->()
 f: ()->()&u32->()
 f<T>: ()->T
}
и мы вызываем
let unit: () = o.f(), то будет вызвана первая функция, тк она имеет самый узкий тип (хотя вторая и третья тоже подходят по сигнатуре), попутно тебе компилятор засрёт всё ворингами, тк вторая функция никогда не будет вызвана с параметром по-умолчанию
ты ведь понимаешь что в выводе типов уравнения в обратную сторону тоже распространяются, в отличие от вывода в каких-нибудь шарпах? Например

let s = "123".parse();
let vec = Vec::with_capacity(s); // тут раст выводит, что parse на предыдущей строке это parse::<usize>
источник

AZ

Alex Zhukovsky in rust_offtopic
polunin.ai
Пока не вижу между ними принципиальных различий еще
в сишарпе невозможно сделать библиотеку num-traits
источник

p

polunin.ai in rust_offtopic
Alex Zhukovsky
в сишарпе невозможно сделать библиотеку num-traits
А это что
источник

AZ

Alex Zhukovsky in rust_offtopic
polunin.ai
Пока не вижу между ними принципиальных различий еще
и это охреннная разница, к слову
источник

AZ

Alex Zhukovsky in rust_offtopic
короч окей
источник