Size: a a a

2020 August 14

CD

Constantine Drozdov in rust_offtopic
Alex Zhukovsky
да нет, просто делаешь Expr в Expr TCommutative и дальше сгатами как я показывал

Add : Expr<True>
Div : Expr<False>

и фиксиь ошибки компиляции
Ты исправляешь 200 ошибок компиляции путем угадывания в каждом месте
источник

AZ

Alex Zhukovsky in rust_offtopic
ну а как иначе 🤷‍♂️
источник

CD

Constantine Drozdov in rust_offtopic
Если бы ты сразу определил множество допустимых операций (и коммутации там не было), код, требующий коммутативности, не мог бы использовать твой Expr
источник

CD

Constantine Drozdov in rust_offtopic
Он был бы уже написан правильно, а не с ошибочными представлениями о том, как будет расширяться Expr
источник

CD

Constantine Drozdov in rust_offtopic
Тебе намного дешевле признать ошибку и пополнить это множество операций, чем попытаться его уменьшить
источник

CD

Constantine Drozdov in rust_offtopic
Да, открытые реализации приводят в рантайме к двойному диспетчеру как ты написал, рантаймовый полиморфизм в принципе не умеет восстанавливать более одного типа за раз и требует перечисление возможностей
источник

CD

Constantine Drozdov in rust_offtopic
Но по крайней мере, у тебя есть возможность сохранить хоть какую-то часть кодовой базы, если тут что-то изменится
источник

CD

Constantine Drozdov in rust_offtopic
Это не относится к случаю, когда содержимое перечисления есть деталь реализации и экспортируются только методы над этим перечислением
источник

AZ

Alex Zhukovsky in rust_offtopic
зато работать с окткрытоым множеством куда труднее
источник

AZ

Alex Zhukovsky in rust_offtopic
и расставляешь пачки NotSupported()
источник

AZ

Alex Zhukovsky in rust_offtopic
не думаю что это лучше
источник

CD

Constantine Drozdov in rust_offtopic
Alex Zhukovsky
зато работать с окткрытоым множеством куда труднее
работать куда труднее, точно так же как работать с иммутабельными структурами куда труднее, да)
источник

CD

Constantine Drozdov in rust_offtopic
потому что это лучше отражает происходящее
источник

CD

Constantine Drozdov in rust_offtopic
Alex Zhukovsky
не думаю что это лучше
вот взгляни под таким углом: пусть есть интерфейс IShape, и в нём не хватает метода square(), очень удобно будет написать этот модуль, вписав в IShape метод, которого тебе не хватает, и реализовать его для всех имеющихся потомков IShape, не правда ли?
источник

AZ

Alex Zhukovsky in rust_offtopic
Constantine Drozdov
вот взгляни под таким углом: пусть есть интерфейс IShape, и в нём не хватает метода square(), очень удобно будет написать этот модуль, вписав в IShape метод, которого тебе не хватает, и реализовать его для всех имеющихся потомков IShape, не правда ли?
нет, наоборот
источник

AZ

Alex Zhukovsky in rust_offtopic
IShape позволяет легко добавлять потомков, но зато добавить на нем метод square() очень сложно
источник

CD

Constantine Drozdov in rust_offtopic
Alex Zhukovsky
нет, наоборот
Я просто описал тебе визитора по енуму в терминах интерфейса
источник

AZ

Alex Zhukovsky in rust_offtopic
Constantine Drozdov
Я просто описал тебе визитора по енуму в терминах интерфейса
визитор это адт, всем понятно
источник

AZ

Alex Zhukovsky in rust_offtopic
короче все до нас уже написано, читани, тут 5 минут: http://wiki.c2.com/?ExpressionProblem
источник

CD

Constantine Drozdov in rust_offtopic
Alex Zhukovsky
IShape позволяет легко добавлять потомков, но зато добавить на нем метод square() очень сложно
К тому, что вряд ли ты будешь так делать, даже если язык тебе разрешит так сделать
источник