0Pricing
Scala for Backend Engineering & Functional Programming · レッスン

インラインメソッド

Scala 3 の inline です。

「インラインメソッド」はCoddyKit上の無料Scala for Backend Engineering & Functional Programmingレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはScala for Backend Engineering & Functional Programming学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Scala for Backend Engineering & Functional Programmingコースには全4レッスンが含まれています。

inline とは

Scala 3 の inline キーワードは、コンパイル時に定義を呼び出し箇所へ展開するようコンパイラーに指示します。完全なマクロに進む前の、メタプログラミングへの入り口です。

インラインメソッド

メソッドに inline を付けると、その本体が呼び出された箇所に置き換えられます。これにより呼び出しのオーバーヘッドをなくし、コンパイル時の特殊化を可能にできます。

inline def square(x: Int): Int = x * x

val r = square(5) // compiles to 5 * 5

インラインパラメーター

inline パラメーターを指定すると、その引数もインライン化されます。引数が定数の場合、コンパイラーはそれをリテラルに畳み込めます。

inline def power(x: Int, inline n: Int): Int =
  if (n == 0) 1 else x * power(x, n - 1)

定数畳み込み

インラインパラメーターがリテラルの場合、分岐や再帰をコンパイル時に完全に解決でき、バイトコードには最終的な式だけが残ります。

inline def power(x: Int, inline n: Int): Int =
  if (n == 0) 1 else x * power(x, n - 1)

val c = power(2, 3) // expands to 2 * 2 * 2 * 1

inline if と inline match

インラインメソッド内の inline if と inline match は、判定対象が静的に判明している場合、コンパイル時に解決され、不要な分岐が除去されます。

inline def label(inline b: Boolean): String =
  inline if (b) "yes" else "no"

透過的なインライン化

transparent inline を使うと、呼び出し箇所ごとにメソッドの戻り値の型をより具体的な型へ絞り込めます。コンパイラーは宣言された型より具体的な型を推論できます。

transparent inline def first(inline b: Boolean): Any =
  inline if (b) 1 else "x" // type can be Int or String

compiletime.error

scala.compiletime パッケージには、error など、カスタムメッセージでコンパイルを失敗させるツールがあります。インライン引数の検証に便利です。

import scala.compiletime.error

inline def positive(inline n: Int): Int =
  inline if (n <= 0) error("n must be positive") else n

インライン値

inline val は真のコンパイル時定数です。他のインライン計算など、リテラルが必要な場所で使用できます。

inline val MaxRetries = 3

inline def retries: Int = MaxRetries

パフォーマンスとコードサイズ

インライン化は、コードサイズと引き換えに速度とコンパイル時の保証を得る仕組みです。大きな本体に使いすぎるとバイトコードが肥大化するため、小規模なメソッド、頻繁に実行されるメソッド、または特殊化が重要なメソッドに限定してください。

inline なしで実行可能な例

同じ二乗計算を、通常の自己完結型プログラムとして記述した例です。inline 版でも呼び出し箇所に乗算が展開され、同じ結果になります。

object Main {
  def square(x: Int): Int = x * x
  def main(args: Array[String]): Unit = {
    println(square(5)) // 25
  }
}

inline は基盤

マクロはインラインメソッドを基盤にします。inline def からマクロを呼び出してコードを生成できます。まず inline を習得すると、マクロの仕組みを理解しやすくなります。

理解度チェック

インラインメソッドに transparent を追加すると、何が変わりますか?

まとめ

Scala 3 のインライン化について学びました:

  • inline def は呼び出し箇所に展開される
  • inline パラメーターと定数畳み込み
  • inline if / inline match
  • transparent inline、inline val、compiletime.error

次はマクロの基礎です。

よくある質問

「インラインメソッド」レッスンは無料ですか?

はい。「インラインメソッド」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Scala for Backend Engineering & Functional Programmingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Scala for Backend Engineering & Functional Programmingコースには全4レッスンが含まれています。

「インラインメソッド」で何を学びますか?

Scala 3 の inline です。 ブラウザで直接実行するハンズオンコードでScala for Backend Engineering & Functional Programmingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Scala for Backend Engineering & Functional Programmingを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのScala for Backend Engineering & Functional Programmingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「インラインメソッド」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このScala for Backend Engineering & Functional Programmingレッスンでコードを書いて実行できますか?

はい。すべてのScala for Backend Engineering & Functional Programmingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. インラインメソッド
  2. マクロの基礎
  3. Quotes と Splices
  4. 実践的なマクロ
← Scala for Backend Engineering & Functional Programmingに戻る