8年間の28,000のコミット、7400のプルリクエスト、4100のクローズされた問題で、Scala 3.0が「Scala言語の完全なオーバーホール」のデリバリーでリリースされた。これは 新機能、構文と型システムの更新、およびメタプログラミングの新しいツールを備えている。Scala互換性リファレンスは、バージョン 3を「すべてのScalaプログラマーの日々のエクスペリエンスを大幅に改善する [...] ゲームチェンジャー」だと予告している。Scala 3はScala 2.13とのバイナリ下位互換性があるが、完全なソースの互換性はない。新しいDottyコンパイラは、古いコードを自動的に移行し、残りの問題をレポートできる。
Scala 3.0は、新しい構文でより簡潔になっている。new
キーワードはオプションになり (GoogleがDart 2.0でこの機能を導入したのと同様)、制御構造の式の括弧も同様だ。いくつか出現する中括弧 (curly braces) は、Pythonでよく知られた特徴であるソースコードのインデントに置き換えられる場合がある。
新しい言語機能により、開発者は独断的なコンテキスト抽象化で意図を直接表現できる。using
句と given
インスタンスでコンテキストパラメータが簡素化され、拡張メソッドは第一級の言語市民であり、implicit
変換が scala.Conversion
クラスのインスタンスとして構築されるようになった。
型システムは、簡略化された列挙型などの機能で改善された。実装の詳細を隠す opaque
型。A & B
や A | B
などの構文を提供する交差と共用の型、結果が関数のパラメーターに依存する新しい従属関数型、そして、かつてScala 2でコンパイラプラグインを必要としていた組み込みのラムダだ。
Scala 2の列挙型構文は冗長だった。次の例を考える:
sealed trait Direction
case object East extends Direction
case object West extends Direction
Scala 3では、より簡潔な構文が導入されている:
enum Direction:
case: East, West
関数型プログラミングは、コンテキスト抽象化と型システムを変更する再設計により簡素化された。オブジェクト指向開発も、次のような新機能で改善された: パラメータを受け入れる traits
は transparent
として宣言される。拡張用にオープンとしてクラスを明示的にマークする open
修飾子。また、Decoratorデザインパターン原則を奨励する精神で、オブジェクトの選択されたメンバのエイリアスを定義する export
句を提供することで、継承よりも集約を優先する。
Scala 2.10で最初に導入されたマクロは、実験的な機能だった。Scala 3には、次の機能を備えた一連のメタプログラミングツールが導入されている: アプリケーションのパフォーマンスを向上させるためのインライン化メソッド。インラインメソッドで使用できるコンパイル時操作。コードを構築および分析するための引用コードブロック。TASTyファイルを含む型付き抽象構文ツリーのビューを提供するリフレクションAPI。安定性のために設計されたScala 3マクロは、Scalaの将来のバージョンと互換性がある。ただし、この新しいメタプログラミングモデルでは、Scala 2.13マクロを書き直す必要がある。さらに、多くのScala 2 scaladoc
設定がScala 3の標準化されたパラメータに変更された。
新しいコンパイラオプション: -Xignore-scala2-macros
は、Scala 2マクロを呼び出すコードでのコンパイラエラーを無視する。-print-tasty
は生のTASTyファイルをプリントする。-no-indent
は、古典的な構文を強制する。これは、コードをコンパイルするための多くの新しいオプションのほんの一部だ。移行ガイドでは、Scala 3への移行について詳しく説明し、Scala 3にScala 2.13プロジェクト全体を移植するためのチュートリアルを含む。
Scala 3.0アプリケーションは、マクロが機能していなくても、機能していないマクロがライブラリを壊さない限り、Scala 2.13ライブラリを使用しつづけることができる。Scala 2.13アプリケーションがScala 3.0ライブラリを使用する可能性があるため、逆も当てはまる。Scala Library Index、別名Scaladexには、Scala 3.0の準備ができているライブラリがリストされている。
ただし、一部のScala 2.13ソースコードはScala 3.0と互換性がないため、これらの変更には代償が伴う。幸い、新しいコンパイラには、Scala 3に自動的にScala 2コードを移行し、手動で修正する必要のある残りの問題をレポートできる移行モードが含まれている。
Scala 3の詳細については、Webサイトの新機能セクションに記述されている。
Scala 3.0を使い始める最も簡単な方法は、ScalaのオンラインIDEであるScastieを使用することだ。この場合、コードをブラウザで直接記述して実行できる。ドキュメントには「Hello、world」プログラムの実行方法も示されている。
リリースから5週間が経ち、Scala 3.0のドキュメントと本は不完全で、Scalaコミュニティは貢献が奨励されている。
新しいScalaリリースは、3.0リリース後6週間ごとに予定されている。開発者は2021年6月末に次のリリースを期待できる。