Anonymous
)00)
Loyd
Нет, ты в типе фактически структуру вычислений показываешь
Loyd
И если ты объединяешь необъединимое, то абстракция хуёвая у тебя
Oleg
это разные типы, реализующие один заранее известный trait
Oleg
абстракция уровня impl Trait
Oleg
да, я вижу как обойтись здесь без аллокации на хипе
Oleg
т.е. без Box
Oleg
такие вопросы здесь постоянно задают
Loyd
да, я вижу как обойтись здесь без аллокации на хипе
Сгенерив кучу кода в месте, где ты будешь это дело обрабатывать
Loyd
Который не влезет в кеш
Oleg
вот тот же вопрос
Oleg
https://is.gd/TO7J6Y подскажите, как это побороть?
Anonymous
ну хорошо у меня есть такой код case mode{ true => xs.map(| x| x * 2) false => xs.filter(|x| x > 10) } определите для него enum мне
Result<Map<Iter<'static, usize>, Box<Fn(usize) -> usize>>, Filter<Iter<'static, usize>, Box<Fn(usize) -> bool>>>
Anonymous
кк
Oleg
|x| x *2 - это не Fn(usize) -> usize
Oleg
т.е. это замыкание, а не функция
Oleg
попробуй сам
Loyd
|x| x *2 - это не Fn(usize) -> usize
В месте, где будет выведен x как usize, это будет именно Fn(usize) -> usize
Anonymous
pub struct Filter<I, P>
Anonymous
P это функция
Oleg
ну хорошо fn my_iter(coef: &usize) { .. match { true => xs.map(|x| x * *coef)
Oleg
так точно не Fn
Loyd
Так F, который F: Fn...
Oleg
Так F, который F: Fn...
так, а как это в Result запихнуть, как @Chronomorphism порекомендовал выше?
Loyd
Без impl никак, очевидно же
Loyd
Что за детские вопросы
Oleg
Без impl никак, очевидно же
я могу impl запихнуть в enum?
分解物質
да, я вижу как обойтись здесь без аллокации на хипе
сделать нужные изминения сразу в слайсе\веке а не возвращять непонятные итераторы
Oleg
представим, что у меня бесконечный итератор
Anonymous
я могу impl запихнуть в enum?
что значит запихнуть
Oleg
что значит запихнуть
в качестве одной из альтернатив
分解物質
они же медленные и аллоцируют
Oleg
В общем, не понравилась моя идея никому
Anonymous
https://github.com/rust-lang/rfcs/pull/1450
Oleg
Автогенерируемых енумов
Loyd
А, можешь же
Oleg
А, можешь же
без бокса?
Loyd
Конечно
Anonymous
я не знаю что релевантно к слову "запихнуть"
Loyd
enum Lol<I> { A(I) } fn g(v: Vec<u32>) -> Lol<impl Iterator<Item = u32>> { Lol::a(v.into_iter()) }
Oleg
я не знаю что релевантно к слову "запихнуть"
enum E{ E1(Map<Iter<'static, usize>>, impl Fn(usize) -> usize),
Oleg
теперь вопрос
Anonymous
что это за синтакс вообще
Oleg
неужели удобно руками писать каждый раз енумы
Oleg
и реализовывать каждый раз тривиальным образом трейты
Loyd
Что?
Loyd
О чём ты вообще?
Loyd
Ты спросил "как запихнуть в enum"
Loyd
Тебе показали.
分解物質
неужели удобно руками писать каждый раз енумы
да, если не плодить их на каждый чих
Oleg
Ты спросил "как запихнуть в enum"
ненене, у меня был пропоузал, генерящий енумы
Oleg
Вопрос был скорее о снятии бойлерплейта
Michael
Anonymous
что вообще значит impl перед названием типа
Loyd
ненене, у меня был пропоузал, генерящий енумы
Для специфичного кейса, когда почти наверняка динамик диспатч лучше
Anonymous
кроме обозначения блока с имплементацией трейта
Oleg
что вообще значит impl перед названием типа
не типа а трейта, impl Trait знаешь что такое?
Anonymous
ок, трейта
Oleg
есть #[derive(...)], если я правильно понял
ну он же не выведет тебе любой трейт на основании того, что каждый вариант енума включает ровно одно поле и реализует этот трейт
Oleg
ок, трейта
загуглил уже impl Trait?
Anonymous
оч смешно
Loyd
загуглил уже impl Trait?
А ты уже определился, где ты выиграешь, используя такой подход?
Loyd
Потому что кроме как вызова аллокатора (а jemalloc хорошо оптимизирован, чтобы отдавать постоянно одинаковые размеры, не slab, конечно, но тоже неплохо), выигрыша нет.
Loyd
А с точки зрения cpu может быть и проигрыш
Oleg
А ты уже определился, где ты выиграешь, используя такой подход?
во всех случаях, где я вместо этого возвращаю Box::new в каждой ветви
Loyd
Ты дальше обрабатывать этот тип должен
Loyd
и внутри него будет такой код: fn do_smthng(...) -> ... { match self { A(a) => a.do_smthng(), B(b) => b.do_smthng() } }
Loyd
Что инлайн? Ты вот эти ветки как инлайнить собрался?
Loyd
Инлайнишь каждую ветку => вылетаешь из кеша, не инлайнишь => у тебя всё равно jmp. Лежат ветки рядом или нет — одному компилятору известно
Oleg
Что инлайн? Ты вот эти ветки как инлайнить собрался?
ну так, компилятор заинлайнит реализацию для каждой ветки в if,а потом пойдёт упрощать, вырезать дед бранчи и т.п.