9

Scalaにはgolangs deferと同等のものがありますか?

から: http://golang.org/doc/effective_go.html#defer

Go の defer ステートメントは、defer を実行する関数が戻る直前に実行される関数呼び出し (遅延関数) をスケジュールします。これは、関数が戻るためにどのパスをたどるかに関係なく、解放する必要があるリソースなどの状況に対処するための珍しいが効果的な方法です。標準的な例は、ミューテックスのロック解除またはファイルのクローズです。

4

3 に答える 3

5

Scala 固有の方法は考えられませんが、これは同等ではありません (ただし、それほどきれいではありません)。

try {
    // Do stuff   
} finally {
    // "defer"
}
于 2013-09-17T08:50:20.567 に答える
2

いいえ。Go がこの構造を持っているのは、まさに例外をサポートしておらず、try...finally構文がないからです。

個人的には、メンテナンスの悪夢を招くと思います。defer の呼び出しは、関数内のどこにでも埋め込むことができます。責任あるコーダーがクリーンアップするもののすぐ横に defer を置いたとしても、それはfinallyブロックほど明確ではなく、乱雑なコーダーができることについては… 少なくともfinallyブロックはすべてのクリーンアップを 1 か所にまとめます。

defer慣用的な Scala の反対です。Scala はプログラム フローを制御するモナドの方法を提供しますが、defer魔法はまったく役に立ちません。モナドは機能的な改善を提供しtry...finallyます。

  • 独自のエラー処理フローを定義する
  • 定義されたフローを機能的に操作する
  • 関数の予想されるエラーをその署名の一部にする

deferこれには居場所がありません。

于 2013-09-17T08:59:10.620 に答える