大域脱出:Scala 3で廃止予定の機能(11)

Scala 3.3.1
最終更新:2023年12月7日

[AD] scalapediaでは記事作成ボランティアを募集しています

この記事では、Scala 3で廃止される予定の大域脱出について解説します。

大域脱出は廃止されます

ネストされた匿名関数からのreturn、通称「大域脱出(nonlocal returns)」は非推奨となりました。

scala.runtime.NonLocalReturnExceptionのかわりに、当面の間は scala.util.control.NonLocalReturns が一時的な代替品として提供されます。

import scala.util.control.NonLocalReturns.* returning { ... throwReturn(x) ... }

大域脱出の問題点とは

大域リターンは scala.runtime.NonLocalReturnException を投げてキャッチすることで実装されています。 しかし以下のような欠点があります。

  • ふつうプログラマはこのような実装であることを期待しない
  • 例外を投げたりキャッチしたりすることがパフォーマンスに影響を与える可能性がある
  • 途中の例外ハンドラが全てキャッチするよう実装されていると、NonLocalReturnException を横取りできてしまう

移行について

Scala 2.13では既に非推奨となっています。

新規の使用はやめましょう。

サイト内検索