А почему одно и то же работает с fn, но

при попытке использовать FnMut ругается borrow checker при компиляции?
И есть ли какой-то способ запинать версию с FnMut, кроме как перенести хэшмап callbacks из Node куда-нибудь в другое место?

https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=e85519e63c320d7347366229948f752b
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=0660d8bf3298919d202c70a978c1244a

10 ответов

15 просмотров

fn это указатель на функцию Fn/FnMut/FnOnce это трейты, которые по определенному владеют захваченными объектами. Подробнее в их описании написано

Valentin- Автор вопроса
Пух
просто fn copy

А то, что я хочу невозможно?

Пух
просто fn copy

А fn какой из Fn реализует?

Valentin
А то, что я хочу невозможно?

*совет дня* юзайте арки вообще там можно на время вызова сам хендлер из мапы мувать, либо как-то список хендлеров отдельно хранить

Пух
все три вроде

Fn. Его достаточно должно быть, так как Fn: FnMut: FnOnce

Конкретно здесь проблема не в FnMut. Ты берешь сначала ссылку иммутабельную на функцию, которая живёт столько же, сколько и &T. И пытаешься передать &mut T. У тебя одновременно живы мут и иммут ссылки. И да, ты dyn забыл у трейта дописать

Похожие вопросы

Обсуждают сегодня

Карта сайта