2017-09-28 10 views
4

私は可変変数を可変的に借りようとしています。 DerefDerefMutFooのために実装されますが、コンパイルは失敗していますDerefMutによるクロージャの変更可能な借用が機能しないのはなぜですか?

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()()'作品:回避策としては、明示的に変更可能な参照を取得する必要があります。面白い。 –

答えて

2

これは、関数の特性がDerefを通じて推測される方法に関するa known issueです。

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

または

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

これが回避策であるとすれば、私は実際にはメソッド名の使用を薦めるでしょう。パターンをより簡単に見つけることができます( 'deref_mut()(')を検索してください)。 –

関連する問題