mrjbom
@mrjbom

FnMut в немутабельной переменной?

Функция принимает FnMut как параметр, должен ли быть параметр мутабельным? Документация говорит, что да.
В winit есть такая функция:
pub fn run<F>(self, event_handler: F) -> Result<(), EventLoopError>
    where
        F: FnMut(Event<T>, &EventLoopWindowTarget<T>),
    {
        self.event_loop.run(event_handler)
    }

Почему тут event_handler не mut?
  • Вопрос задан
  • 41 просмотр
Решения вопроса 1
bingo347
@bingo347
Crazy on performance...
Мутабельность нужна для вызова, так как FnMut вызывается по мутабельной ссылке.
Здесь же только передаётся владение в метод run

P.S. что-то мне подсказывает, что сигнатура не совсем корректная. Отсутствует объявление дженерика T (и возможно его ограничений), отсутствует лайфтайм для ссылки в колбэке:
pub fn run<T, F>(self, event_handler: F) -> Result<(), EventLoopError>
    where
        F: for<'a> FnMut(Event<T>, &'a EventLoopWindowTarget<T>),
{
    self.event_loop.run(event_handler)
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
vabka
@vabka Куратор тега Rust
Потому что замыкание, которое не имеет мутабельных ссылок на окружение - автоматически реализует трейты Fn, FnMut и FnOnce.

В функции run указан самый широкий вариант из возможных (Fn обычный был бы слишком узким, а FnOnce для run не подходит, тк замыкание предполагается вызывать много раз)

https://habr.com/ru/articles/588917/
https://stackoverflow.com/questions/30177395/when-...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы