Scala 3で変更・廃止予定の機能と移行作業についてのまとめ

Scala 3.3.1
最終更新:2020年9月20日

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

この記事では、Scala 3にて変更・廃止予定の機能と移行作業を行うべき時期について解説します。

Scala 3へのバージョンアップをするにあたり、なるべく早めにすべての移行作業を終えるのが理想ですが、実際はそうもいかないですよね。

Scala 3での変更は多岐にわたるため、いざ移行作業を始めてみると膨大な作業量に直面して行き詰まってしまうことがあるかもしれません。

そんなみなさんのために、移行をスムーズに行うにはどの機能から着手するとよいのか、どの機能の対応は後回しにできるのか、といった情報提供をいたします。

なにかの参考になれば幸いです。それでは早速見ていきましょう。

今後変更される可能性がある点に注意

現時点(2020年9月20日)では、Scala 3はまだ開発中で、ドキュメントも整備中なので、予定が変更される可能性があります。
念のためScala 3移行ガイドやDotty公式サイト、公式フォーラムにて最新情報をご確認いただけると安全です。

外部リンク:Dotty
外部リンク:Scala Contributors

また、もし公式発表との間に矛盾や不明点があった場合には、GitterやTwitterやフォームなどからぜひお気軽にご一報ください。
ご協力どうぞよろしくお願いいたします。

移行オプションを使用して、段階的に移行作業を行う

さて、バージョンアップとそれに伴う移行作業はどのように進めていけばよいのでしょうか?

Scala 3への移行は一度にすべて行うのではなく、段階的に進められるよう設計されています。

おかげで何から移行に着手するのがよいか考える必要が生じましたが、一度に全部やらなければならないよりはずっとマシですね。

段階的な移行を補助するため、Scala 3には「移行オプション」が用意されています。

移行オプションを使用すると、以前のバージョンの機能が使用できたり、移行対象のコードを自動で書き換えたりできます。

移行オプションについて、詳しくは以下の記事を参照してください。

2.13での警告について

一部の機能はScala 2.13で既に非推奨となっており、使用している箇所に対してコンパイル時に警告が出力されます。

コンパイラオプション-deprecationを有効にすると、警告をさらに詳細に出力することができます。

Scala 3.0への移行に先立ち、これらの警告を一掃しておくとよいでしょう。

2.12以前からの移行について

2.12以前のScalaを使用している場合には、まずは2.13までアップデートしてください。

Scala 2.12でコンパイラオプション-Xmigrationを使用すると、Scala 2.13への移行を補助する情報が出力されるので便利です。

移行時期と機能一覧

以下では、変更・廃止予定の各機能について、移行すべき時期をまとめます。

2.13で対応しておくべき機能

以下の機能は、Scala 3.0ではサポートされていない機能です。

Scala 3.0には実装されておらず、完全に廃止されます

つまり、たとえ移行オプション3.0-migrationを使用しても、2系の挙動は再現されません。

したがって、Scala 3へのアップデート作業を行う前、Scala 2.13のうちにあらかじめ対応を済ませておく必要があります。

  • DelayedInitトレイト
  • 存在型
  • 弱適合
  • クラスシャドウイング

DelayedInitトレイト

DelayedInitトレイトは、主にAppトレイトを実現するために使用されていました。

DelayedInitトレイトは、既にScala 2.11.0から非推奨となっています。

詳しくは以下の記事を参照してください。

存在型

存在型は、「ある型にとってたしかに存在している、しかし未知である何らかの特別な型」のことを指します。

Scala 3にて、存在型を表現するためのforSomeキーワードが廃止されました。

詳しくは以下の記事を参照してください。

弱適合

弱適合とは、リストの要素に複数の数値型が混在する場合において、数値型を他の数値型に自動的に変換して扱うという機能です。

Scala 3でも自動変換は行われるものの、対象はIntのみと狭められ、変換規則も変更されています。

詳しくは以下の記事を参照してください。

クラスシャドウイング

クラスシャドウイングとは、クラスの継承先が持つ内部クラスと同名の内部クラスを定義した際には、継承先の内部クラスをオーバーライドするのではなく、完全に隠蔽して別の内部クラスを定義することになるという仕様のことです。

詳しくは以下の記事を参照してください。

Scala 3へのアップデートと同時に移行作業をする必要がある機能

以下の機能は、複雑さ故に移行作業に手間がかかる機能です。

  • Scala 2のマクロ(※調査中)
  • 先行初期化

Scala 2 のマクロ

(※ Scala 2のマクロに関してはまだ調査中です)

マクロは、メタプログラミングのためのフレームワークです。

Scala 2系のマクロはScala 3のマクロとは互換性がありません。

Scala 3.0では完全に廃止されます。

したがって、2系のうちに移行準備を進めておく必要があります。

メタプログラミングの移行ガイドは現在作成中ですので、方針を決定するのは出来上がるまで待つのがよさそうです。

先行初期化

先行初期化というテクニックは、トレイトパライメータの導入により不要になりました。

移行オプションが用意されておらず、両者を同時に使用するすべがないため、場合によっては一時的な回避策を利用する必要があります。

詳しくは以下の記事を参照してください。

3.0へのアップデート後に移行すればよい機能

以下の機能は、Scala 3で変更・廃止予定でありながらも、移行オプション3.0-migrationを有効にすることによってScala 3.0へのアップデート後にも引き続き使用し続けられる機能です。

つまり、これらの機能については、一旦Scala 3.0へアップデートした後に移行作業を進めればよいことになります。

  • 手続き型構文
  • シンボルリテラル
  • 自動適用
  • 型射影
  • do-while文
  • auto tupling(実装済みですがまだマージされていません)

これらの機能は、通常、Scala 3.0ではコンパイルが通りません。

Scala 3.1では完全に廃止される予定です。
Scala 3.0のうちに対応しましょう。

手続き型構文

手続き型構文とは、メソッドを手続き型言語のメソッドに似せた書き方をすることのできる機能です。

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

詳しくは以下の記事を参照してください。

シンボルリテラル

シンボルリテラルは、シンボルオブジェクトを生成するときに使えるリテラルです。

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

移行オプション3.0-migrationを設定している際にコンパイラオプション-rewriteを設定すると、自動でwhile文に書き換えてもらえます。

詳しくは以下の記事を参照してください。

自動適用

自動適用とは、()付きで定義したメソッドを()なしでも呼び出せる機能です。

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

詳しくは以下の記事を参照してください。

型射影

詳しくは以下の記事を参照してください。

do-while文

do-while文は、ループ処理のための制御構文でした。

移行オプション3.0-migrationを設定している際にコンパイラオプション-rewriteを設定すると、自動でwhile文に書き換えてもらえます。

詳しくは以下の記事を参照してください。

廃止時期が未定で当面使い続けられる機能

以下の機能は、廃止時期がまだ具体的に定まっていないため、当面の間は使用し続けられる機能です。

これらの機能の今後については、3系の開発が進んだ頃にまた確認してください。

  • XMLリテラル
  • 複合型
  • パッケージオブジェクト
  • 大域脱出
  • [this]修飾子

XMLリテラル

XMLリテラルとは、Scalaのコード中にXMLを記述できる機能です。

詳しくは以下の記事を参照してください。

複合型

複合型と、より多機能な交差型については、こちらの記事にて解説しています。

パッケージオブジェクト

パッケージオブジェクトは、トップレベル定義ができることになったため不要になりました。

詳しくは以下の記事を参照してください。

大域脱出

大域脱出は、入れ子になった匿名関数から脱出する方法でした。

詳しくは以下の記事を参照してください。

[this]修飾子

private[this]protected[this]などに用いられる[this]修飾子は将来的に廃止されます。

詳しくは以下の記事を参照してください。

参考リンク

サイト内検索