2017-09-28 1 views
4

J'essaie d'emprunter de manière mutable une variable mutable. Deref et DerefMut sont mises en œuvre pour Foo, mais échoue compilation:Pourquoi un emprunt mutable d'une fermeture via DerefMut ne fonctionne pas?

use std::ops::{Deref, DerefMut}; 

struct Foo; 

impl Deref for Foo { 
    type Target = FnMut() + 'static; 
    fn deref(&self) -> &Self::Target { 
     unimplemented!() 
    } 
} 

impl DerefMut for Foo { 
    fn deref_mut(&mut self) -> &mut Self::Target { 
     unimplemented!() 
    } 
} 

fn main() { 
    let mut t = Foo; 
    t(); 
} 
error[E0596]: cannot borrow immutable borrowed content as mutable 
    --> src/main.rs:20:5 
    | 
20 |  t(); 
    | ^cannot borrow as mutable 
+1

't.deref_mut()()' œuvres. Intéressant. –

Répondre

2

Ceci est a known issue sur la façon dont les traits de fonction sont déduites par Deref. Pour contourner ce problème, vous devez obtenir explicitement une référence mutable:

let mut t = Foo; 
(&mut *t)(); 

ou

let mut t = Foo; 
t.deref_mut()(); 
+1

Étant donné que c'est une solution de rechange, je serais très favorable à l'utilisation d'un nom de méthode. Cela facilite la recherche du motif (recherchez 'deref_mut() ('). –