2016-03-29 13 views
0

Fnクロージャを構成することができますcompose機能です:このコン機能がFnMutクロージャを取ることができるように`FnMut`クロージャを構成できる関数を書くにはどうしたらいいですか?ここ

fn compose<'a, T1, T2, T3, F1, F2>(f: F1, g: F2) -> Box<Fn(T1) -> T3 + 'a> 
    where F1: Fn(T1) -> T2 + 'a, 
      F2: Fn(T2) -> T3 + 'a 
{ 
    box move |x| g(f(x)) 
} 

は、どのように私はそれを作るのですか?私が試した:

fn compose<'a, T1, T2, T3, F1, F2>(f: F1, g: F2) -> Box<FnMut(T1) -> T3 + 'a> 
    where F1: FnMut(T1) -> T2 + 'a, 
      F2: FnMut(T2) -> T3 + 'a 
{ 
    box move |x| g(f(x)) 
} 

しかし、それは文句を言う:

error: cannot borrow captured outer variable in an `FnMut` closure as mutable 
     box move |x| g(f(x)) 
        ^
error: cannot borrow captured outer variable in an `FnMut` closure as mutable 
     box move |x| g(f(x)) 
         ^

は、この拡張、FnOnce、クロージャで動作させることができますか?

答えて

2

ローカル変数fgは変更可能でなければなりません:

fn compose<'a, T1, T2, T3, F1, F2>(mut f: F1, mut g: F2) -> Box<FnMut(T1) -> T3 + 'a> 
    where F1: FnMut(T1) -> T2 + 'a, 
      F2: FnMut(T2) -> T3 + 'a 
{ 
    Box::new(move |x| g(f(x))) 
} 
+0

興味深いです。エラーメッセージはあまり役に立ちませんが、改善できるかどうか疑問です。 – Shepmaster

+0

ありがとうございます、 'FnOnce'でも動作させることができますか? – CMCDragonkai

関連する問題