1. 概要

Scala 3で導入された新機能の1つは、中括弧の一部の発生を抑制する可能性でした。

2. オプションの中括弧

一部の中括弧は、強制インデントで置き換えることができます。 さらに、インデントが不十分なプログラムには警告のフラグが付けられます。 これは重要なインデントと呼ばれ、デフォルトで有効になっています。 コンパイラフラグ-no-indentを使用して、この機能を無効にすることができます。

2.1. インデントルール

適切にインデントされたプログラムには2つのルールがあります。 これらのいずれかが尊重されない場合、コンパイラーは警告を発します。 まず、中括弧で区切られた領域では、改行を開始する最初の中括弧の後の最初のステートメントの左側からステートメントを開始することはできません。

if (x < 0) {
  println(1)
  println(2)

println("done")  // error: indented too far to the left

次に、重要なインデントがオフになっていて、式のインデントされたサブパートの先頭にあり、インデントされた部分が改行で終わっている場合、次のステートメントはサブパートよりも小さいインデント幅で開始する必要があります。

if (x < 0)
  println(1)
  println(2)   // error: missing `{`

これらの規則は、意図的にそれほど厳密ではありません。 彼らの目標は、中括弧の欠落に関連するエラーの根本原因を特定するのに役立つことです。

2.2. クラス定義用のオプションの中括弧

新しいclass trait 、または object を定義する場合、コロン(’:’)を使用して中括弧を省略することもできます。 以下は、Scala3で有効な定義です。

trait A:
  def f: Int

class C(x: Int) extends A:
  def f = x

object O:
  def f = 3

enum Color:
  case Red, Green, Blue

new A:
  def f = 3

package p:
  def a = 1

package q:
  def b = 2

2.3. ケース句の特別扱い

Scala 3では、 match / case句の構文にもいくつかの変更が加えられました。 Scala 3より前は、パターンマッチングを使用する場合、中括弧を使用する必要がありました。

import scala.util.Random

val x: Int = Random.nextInt(10)

x match {
  case 0 => "zero"
  case 1 => "one"
  case 2 => "two"
  case _ => "other"
}

しかし、 Scala 3では、中かっこなしで書き直すことができるようになりました

import scala.util.Random

val x: Int = Random.nextInt(10)

x match
case 0 => "zero"
case 1 => "one"
case 2 => "two"
case _ => "other"

2.4. endマーカー

この新機能について説明するときに発生する可能性のある問題の1つは、特定のブロックが終了したときにコードを理解しにくくする可能性があることです。 この問題を解決するために、Scala3はオプションのendマーカーを提供します。

def largeMethod(...) =
  ...
  if ... then ...
  else
    ... // a large block
  end if
  ... // more code
end largeMethod

終了マーカーは、キーワードendと指定子トークンで構成されます。 指定トークンは、次のいずれかになります。

  • もしも
  • その間
  • 為に
  • マッチ
  • 試す
  • 新着
  • これ
  • val
  • 与えられた

3. 結論

この記事では、Scala3で導入された多くの新機能の1つであるオプションの中括弧を見ました。 この言語機能を使用すると、特定のインデント規則に従うことで、中括弧の一部の使用法を置き換えることができます。