функцию которая принимает входные данные и массив решений, которые запускаются и сравниваются с правильным ответом и прочее. Входные данные всегда &str, а ответ может быть любым (только приводимым к строке). Упрощенный пример выглядит так:
fn run<R: Display>(solutions: &[&dyn Fn(&str) -> R])
fn solution_1 (input: &str) -> i32
fn solution_2 (input: &str) -> usize
run(&[&solution_1, &solution_2])
я понимаю почему это не работает, но не знаю как можно переписать run чтоб было не ужасно. Сейчас я справляюсь тем что оборачиваю в кложуру и привожу к одному типу там. Менять код самих решений очень не хочется. Что тут лучше сделать?
более подробный пример
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=bcfa66d49eea087fbd643ac87d115cbe
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=70670caf1e8ffb0a997354c7727f941a
охтыж, спасибо, подходит!) всё по отдельности кое-как понимаю, но как такая штука вместе работает еще предстоит понять)
" Сейчас оборачиваю решения в кложуру и внутри привожу к одному типу" вот я сделал по сути то же самое. adapt принимает функцию, которая возвращает тип, имплементящий Display, а возвращает функцию которая возвращает Box, внутри которого тип, имплементящий Display а из таких функций уже можно создавать массивы ну и уточнение, что это не функции а Fn трейт на входе и выходе
тоже это подумал, но почему именно эта россыпь из лайфтаймов + box/dyn работает позже посижу разберусь, пока такое чаще разруливаю копипастой что советует компилятор
может что то и можно опустить из лайфтаймов, я вижу ошибку лайфтайма - расписываю все: кто кого должен пережить - ошибка уходит может где то и лишний так появляется, который компилятор сам мог вывести
ага, все чаще замечаю что переписываю код, который раньше почти бездумно копировал из подсказок компилятора, и получается лучше) иногда даже вижу логику почему именно так советовал, но оказывается можно просто иначе. Спасибо еще раз, есть под чем подумать)
Обсуждают сегодня