Anonymous
и
Anonymous
в хаскеле есть кейворд newtype
Vladimir
Ну тут вам не хаскель
Anonymous
и
A64m
какой же зирокост, если нельзя кастануть бесплатно
Vladimir
Просто сначала напиши код
Vladimir
Который кастит
Vladimir
Бойлерплейт
Anonymous
тебе стоит понять что делает оператор для кастинга в расте
Anonymous
перед такими заявлениями
A64m
так если пишешь код, который кастит - это не бесплатно как для программиста, так и для рантайма
Alexey
хочется простого - хочу сказать, что мне нужен такой же тип, с ровно теми же операциями и прочими плюшками, но чтобы приводить к старому типу и обратно нужно было явным образом.
Alexey
всё. больше ничего мне не нужно.
Alexey
есть простой способ это сделать? вроде штука то элементарная.
Anonymous
почему тебе так хочется заставить других повторяться
A64m
есть простой способ это сделать? вроде штука то элементарная.
не элементарная, на само деле, там много всяких неочевидных сложностей
Alexey
Ы?
Vladimir
так если пишешь код, который кастит - это не бесплатно как для программиста, так и для рантайма
Бесплатно для рантайма защет мув семантики, а о программисте речь и не шла
Alexey
typedef просто алиас заводит, там же даже кастовать не надо
Anonymous
https://aturon.github.io/features/types/newtype.html
struct Miles(pub f64); struct Kilometers(pub f64); impl Miles { fn as_kilometers(&self) -> Kilometers { ... } } impl Kilometers { fn as_miles(&self) -> Miles { ... } }
Anonymous
Я его даже компилил под малиной
Ну я компилю на убунте. Не хочу ставить компиляторы и другое на малину
Vladimir
Ну я компилю на убунте. Не хочу ставить компиляторы и другое на малину
Ну и правильно, но мне было в падлу под маком гцц компилить
A64m
Бесплатно для рантайма защет мув семантики, а о программисте речь и не шла
не понял, вот я пишу "каст" хештаблицы с A в хештаблицу с int32 и наоборот. В этом коде надо хештаблицу новую создавать и наполнять значениями из старой разворачивая/заворачивая инты в A как это делать зиро кост?
分解物質
typedef просто алиас заводит, там же даже кастовать не надо
то есть нужен механизм создания копии типа с нем же набором методов но только с явным привидением?
Anonymous
А складывать то мили с милями можно?
ты знаешь что такое тапл-стракт?
Anonymous
ответь
分解物質
да
явного механизма в rust именно для этого нет
Anonymous
ладно
Anonymous
смотри
Anonymous
тапл-стракт это такой же стракт, но вместо названий там цифры индексов
Anonymous
с чего бы ему магическим способом получать операторы типов которые внутри?
Anonymous
мы ведь так же можем и написать struct A(i32, String, bool)
Anonymous
суть в том, что если там только один тип то компилятор может это оптимизировать до такого уровня что оверхеда не вообще будет
A64m
с чего бы ему магическим способом получать операторы типов которые внутри?
с того, что написан дерайвинг соотвествующих "типажей" для структур с одним полем например
Anonymous
но синтаксической магии это нам давать не будет
Anonymous
из диалога
分解物質
A64m
Угу. Так и сделано для таплов в c++. Для операции < например
так вариант с явным объявлением дерайвингов операций годится или нет?
A64m
при объявлении обертки например?
分解物質
человеку влом все методы к новому типу определять
можно сгенерить несложным макросом
Loo
https://github.com/LooMaclin/derive-newtype-transformer/blob/master/test-derive-newtype-transformer/src/lib.rs
Alexey
так вариант с явным объявлением дерайвингов операций годится или нет?
Как много придетс наколбасить кода, чтобы создать клон float например?
A64m
см.
ну дерайвишь то что у вас там в расте вместо Num и складываешь мили с милями, а с километрами компилятор не дает, вроде все как надо?
Anonymous
это возможное решение
Anonymous
но какая мне разница если я пытаюсь объяснить недопонимание
Alexey
но я понял, спасибо. все примерно как в плюсах. только с большим закосом в сторону явности.
A64m
Как много придетс наколбасить кода, чтобы создать клон float например?
перечислить типажи которые надо унаследовать у флоата
Vladimir
Неявно
Alexey
перечислить типажи которые надо унаследовать у флоата
А у float'a явным образом типажи в языке уже определены?
A64m
Неявно
так как там с хештаблицей быть?
A64m
А у float'a явным образом типажи в языке уже определены?
я говорил как это делается в языке где есть ньютайпы, там да, определены
Vladimir
так как там с хештаблицей быть?
Хештаблица в расте ковариантна типу значения?
A64m
Хештаблица в расте ковариантна типу значения?
что, структура оборачивающая инт становится подтипом инта? При чем тут вариантность-то?
Vladimir
что, структура оборачивающая инт становится подтипом инта? При чем тут вариантность-то?
Ты ж говоришь о кастинге таблиц, как это должно происходить без переборки коллекции, если таблица не будет ковариантна типу?
Anonymous
какая разница то
Anonymous
то, что оно зеро кост не подразумевает что as оператор будет магически смотреть глубже типов
Loo
У меня была ситуация когда был ньютайп вокруг примитива и два других ньютайп вокруг этого ньютайп, когда необходимо было поработать с обоими ньютайпами в хэш таблице, приходилось кастатить в нижележащей ньютайп перед началом работы
Anonymous
кстати хмм
A64m
Ты ж говоришь о кастинге таблиц, как это должно происходить без переборки коллекции, если таблица не будет ковариантна типу?
настоящая вариантность требует универсального представления для всех типов, а для такого каста который только типами с одинаковым представлением работает такого не нужно
Cat
Можно же кастить к трейту
Vladimir
что, структура оборачивающая инт становится подтипом инта? При чем тут вариантность-то?
Короче, в расте нет "subtyping" твоя структура не наследует инт.
A64m
значит и о вариантности нет смысла говорить
Vladimir
Тогда зачем говорить о коллекциях?
Vladimir
Ещё раз, сам тип конвертится зирокостно fn to_u32(v:A(u32)) ->u32{ v.0 } Развернется в nop
Anonymous
можно в принципе вот так сделать если не нравится писать .0 struct A(i32); impl Deref for A { type Target = i32; fn deref(&self) -> &i32 { &self.0 } }
Loo
Не делайте так
Anonymous
🤷‍♀️