1

私は Rust を学んでおり、クロージャーを試すための簡単なコードを実装しましたが、解決方法がわからないというボローチェッカーの問題に直面しています。

次の関数をコンパイルする場合

fn twice(x:int, f:|int| -> int) -> int {
    f(f(x))
}

次のエラーが表示されます

closure requires unique access to `f` but it is already borrowed

私はガイドに取り組んでおり、借用チェッカーがこれを好まない理由をある程度理解していますが、それを解決する方法がわかりません。

最初の呼び出しの結果を最初に一時変数に割り当ててから、f(..)これを再度呼び出すことで回避できます。しかし、これはエレガントではありません。

よりクリーンな/より良い書き方f(f(x))、またはこれが安全であることをコンパイラに納得させる方法はありますか?

4

2 に答える 2

3

完全なエラー メッセージは次のとおりです。

<anon>:2:7: 2:8 error: closure requires unique access to `f` but it is already borrowed
<anon>:2     f(f(x))
               ^
<anon>:2:5: 2:6 note: previous borrow of `f` occurs here; the unique capture prevents subsequent moves or borrows of `f` until the borrow ends
<anon>:2     f(f(x))
             ^
<anon>:2:12: 2:12 note: previous borrow ends here
<anon>:2     f(f(x))
                   ^

つまり、外部呼び出しは、ある意味で予約fされており、最初に使用されるのを防いでいます。これは、クロージャーではなくメソッドに関するissue #6268と非常によく似ています。

あなたが言うように、一時的なものを使用することは修正であり、最も合理的な修正です。

fn twice(x:int, f:|int| -> int) -> int {
    let y = f(x);
    f(y)
}
于 2014-11-15T05:51:30.730 に答える