Технически один и тот же тип может реализовать трейт Fn несколько раз, но с разными типами аргументов. Как следствие, по типу F (который хранится у тебя в Cacher) невозможно восстановить тип Input. Добавь в структуру поле типа PhantomData<Input>
чтобы ты добавил поле _pd: PhantomData<fn(Input)>
Точно, про ковариантность забыл
мне кажется стоит попробовать убрать Input оттуда и сделать дженериком метод value
хотя нет, такая себе идея
хм, получилось нормально (плейграунд)
добавила тест (ignore), который при решении с фантомдатой даже не скомпилировался бы https://play.rust-lang.org/?version=nightly&mode=debug&edition=2021&gist=051e9a59e17d204598771f29954bd8ce
ого. а какая магия позволяет вызывать .value() с аргументами разных типов в этом ignore тесте?
Собственно impl<A, ..> FnOnce<A>
там же всё есть FnOnce/FnMut/Fn имплементированы для любых аргументов
Обсуждают сегодня