Quais são as condições específicas para um fecho para implementar a Fn
, FnMut
e FnOnce
traços?
Isso é:
- Quando um fechamento não implementa o
FnOnce
traço? - Quando um fechamento não implementa o
FnMut
traço? - Quando um fechamento não implementa o
Fn
traço?
Por exemplo, alterar o estado do fechamento em seu corpo faz com que o compilador não implemente Fn
nele.
Respostas:
Cada uma das características representa propriedades cada vez mais restritivas sobre fechamentos / funções, indicadas pelas assinaturas de seu
call_...
método e, particularmente, o tipo deself
:FnOnce
(self
) são funções que podem ser chamadas uma vezFnMut
(&mut self
) são funções que podem ser chamadas se eles tiverem&mut
acesso ao seu ambienteFn
(&self
) são funções que podem ser chamadas se eles só tiverem&
acesso ao seu ambienteUm fechamento
|...| ...
implementará automaticamente tantos deles quanto puder.FnOnce
: um encerramento que não pode ser chamado uma vez não merece o nome. Observe que, se uma closure implementa apenasFnOnce
, ela pode ser chamada apenas uma vez.FnMut
, permitindo que sejam chamados mais de uma vez (se houver acesso sem alias ao objeto de função).Fn
, permitindo que sejam chamados essencialmente em qualquer lugar.Essas restrições decorrem diretamente do tipo
self
e da "remoção" dos fechamentos em estruturas; descrito em minha postagem do blog Finding Closure in Rust .Para obter informações sobre fechamentos, consulte Fechamentos: funções anônimas que podem capturar seu ambiente na linguagem de programação Rust .
fonte
FnOnce
, isso significa que ele pode ser chamado apenas uma vez?FnOnce
".