既存のScala 2との違い

Scala 3は、Scala 2から大幅に進化したプログラミング言語であり、構文、型システム、メタプログラミング、オブジェクト指向設計など、さまざまな側面で改善が施されています。以下に、Scala 2との主な違いを詳しく説明します。


1. 構文の改善と簡素化

インデントベースの構文と省略可能な中括弧

Scala 3では、Pythonのようなインデントベースの構文が導入され、中括弧 {} の使用が省略可能になりました。これにより、コードの可読性が向上し、視覚的なノイズが減少します。

scala
// Scala 2 if (x > 0) { println("Positive") } // Scala 3 if x > 0 then println("Positive")

new キーワードの省略

クラスのインスタンス化時に、new キーワードを省略できるようになりました。​

scala
// Scala 2 val list = new List(1, 2, 3) // Scala 3 val list = List(1, 2, 3)

@main アノテーションによるエントリーポイントの簡素化

Scala 3では、@main アノテーションを使用することで、エントリーポイントの定義が簡素化されました。​Medium

scala
@main def run(): Unit = println("Hello, World!")

インポート構文の変更

ワイルドカードインポートの構文が変更され、より直感的になりました。​

scala
// Scala 2 import scala.util._ // Scala 3 import scala.util.*


2. 型システムの強化と新機能

ユニオン型と交差型

Scala 3では、ユニオン型 (A | B) と交差型 (A & B) が導入され、型の表現力が向上しました。​Medium+2Scala Documentation+2Scala Documentation+2

scala
def process(value: Int | String): Unit = value match case i: Int => println(s"Int: $i") case s: String => println(s"String: $s")

列挙型 (enum) の導入

Scala 3では、列挙型が言語レベルでサポートされ、代数的データ型の定義が簡潔になりました。​DE Academy+5Scala Documentation+5Wikipedia+5

scala
enum Color: case Red, Green, Blue

不透明型 (opaque type) の導入

不透明型を使用することで、実装の詳細を隠蔽しつつ、パフォーマンスへの影響を最小限に抑えることができます。​

scala
opaque type UserId = Int object UserId: def apply(id: Int): UserId = id

マッチ型 (match types) の導入

型レベルでのパターンマッチングが可能になり、型に基づく計算や変換が容易になりました。​

scala
type Elem[X] = X match case String => Char case Array[t] => t case Iterable[t] => t


3. コンテキスト抽象の再設計

given / using 構文の導入

Scala 2の implicit に代わり、Scala 3では given と using を使用して、依存関係の注入や型クラスのインスタンス提供が明確になりました。​

scala
given intOrdering: Ordering[Int] with def compare(x: Int, y: Int): Int = x - y def sortList[T](list: List[T])(using ord: Ordering[T]): List[T] = ???

拡張メソッドの明示的な定義

Scala 3では、拡張メソッドを明示的に定義できるようになり、コードの可読性と保守性が向上しました。​

scala
extension (s: String) def greet: String = s"Hello, $s"


4. オブジェクト指向設計の改善

トレイトのパラメータ化

トレイトにパラメータを渡すことが可能になり、より柔軟な設計が可能になりました。​

scala
trait Logger(level: String): def log(message: String): Unit = println(s"[$level] $message")

クラスの拡張制御

クラスを拡張可能にするには、明示的に open 修飾子を付ける必要があり、設計の意図が明確になります。​

scala
open class BaseClass


5. メタプログラミングの強化

Scala 3では、メタプログラミング機能が強化され、型安全なマクロやコンパイル時の計算が可能になりました。​

scala
inline def assert(condition: Boolean): Unit = if !condition then throw new AssertionError("Assertion failed")


6. 標準ライブラリとツールチェーンの互換性

Scala 3は、Scala 2.13の標準ライブラリをベースにしつつ、scala.deriving や scala.compiletime などの新しいモジュールを追加しています。これにより、既存のライブラリとの互換性を保ちつつ、新機能の活用が可能です。​Stack Overflow

また、Scala 3は Dotty コンパイラを採用しており、コンパイル速度の向上やエラーメッセージの改善が図られています。​


7. 移行のサポートと互換性

Scala 3への移行は段階的に行うことが可能であり、Scala 2.13とScala 3のコードを同一プロジェクト内で共存させることができます。​

また、scala3-migrate ツールを使用することで、Scala 2のコードをScala 3に自動変換する支援が受けられます。​Scala Documentation


結論

Scala 3は、Scala 2の強力な機能を継承しつつ、構文の簡素化、型システムの強化、メタプログラミングの改善など、多くの面で進化を遂げています。これにより、開発者はより安全で表現力豊かなコードを書くことが可能になり、保守性や生産性の向上が期待できます。​

既存のScala 2プロジェクトをScala 3に移行する際には、段階的なアプローチとツールの活用が推奨されます。​

生成日:2025/05/04