型推論
コンパイラーに型を推論させます。
「型推論」はCoddyKit上の無料Scala for Backend Engineering & Functional Programmingレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはScala for Backend Engineering & Functional Programming学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Scala for Backend Engineering & Functional Programmingコースには全4レッスンが含まれています。
型推論とは
Scala は静的型付け言語ですが、型を明示的に書く必要はほとんどありません。コンパイラーが右辺の値から型を推論します。
これにより、動的言語の簡潔さと型による安全性を両立できます。
val n = 42 // inferred Int
val label = "hi" // inferred Stringリテラルからの推論
val x = 5と書くと、コンパイラーはIntリテラルを認識し、xの型をIntにします。
小数リテラルはDoubleになり、引用符で囲んだテキストはStringになります。
object Main extends App {
val count = 5
val ratio = 1.5
println(count + ratio)
}関数の戻り値の推論
コンパイラーは、メソッドの本体から戻り値の型を推論することもできます。
ここでは、本体が2つのInt値を掛け合わせているため、squareはIntを返します。型を明示する必要はありません。
object Main extends App {
def square(x: Int) = x * x
println(square(6))
}パラメーターには型が必要
推論には限界があります。メソッドのパラメーターには注釈が必要です。コンパイラーには、そこから推論するための情報がないためです。
以下のスニペットは、xに: Intを付けないとコンパイルできません。
def increment(x: Int) = x + 1 // type on x is required推論される共通型
値が複数の型になり得る場合、Scala は最も具体的な共通型を推論します。
算術演算でIntとDoubleを混ぜると、結果はDoubleに広がります。
object Main extends App {
val mixed = 3 + 2.0 // Double
println(mixed)
}コレクションでの推論
コレクションは、格納する値から要素の型を推論します。
整数のリストは自動的にList[Int]になるため、注釈なしで完全な型安全性を保てます。
object Main extends App {
val nums = List(1, 2, 3) // List[Int]
println(nums.sum)
}推論に驚かされる場合
推論によって、望んでいた型より広い型が選ばれることがあります。異なる数値を混ぜたリストは、List[Double]、場合によってはList[AnyVal]と推論されます。
推論された型が目的に合わない場合は、明示的な注釈を追加します。
val a = List(1, 2.0) // List[Double]
val b = List(1, "two") // List[Any]注釈で上書きする
いつでも明示的に指定できます。型を注釈で指定すると、意図を文書化でき、狭すぎる推論を上書きできます。
ここでは、リテラル7を意図的にLongへ広げています。
val seconds: Long = 7
val data: List[Int] = List(1, 2, 3)パブリック API では明示する
一般的なスタイル上のルールとして、ローカルのvalには推論を任せ、パブリックメソッドには明示的な戻り値の型を書きます。
これにより、実装が変わってもライブラリの契約を安定させられます。
def total(items: List[Int]): Int = items.sum推論でも型安全性は保たれる
推論によって型システムが弱まることはありません。コンパイラーは無効な操作を引き続き拒否します。
以下では、nameはStringと推論されるため、数値との乗算はコンパイルに失敗します。これは正しい動作です。
val name = "Lia"
val bad = name * 3 // error: value * is not a member of String in this sense推論された val も不変
推論が補うのは型だけです。束縛が可変かどうかは変わりません。
val n = 10は依然として不変で、Intとして固定されます。コンパイラーが: Intと入力する手間を省いただけです。
object Main extends App {
val n = 10 // inferred Int, still a val
println(n * n)
}理解度チェック
Scala で型を記述する必要が残るのは、どこでしょうか。
まとめ
型推論により、Scalaは静的な安全性を損なわずに簡潔に記述できます。
- ローカルの
valと戻り値の型は、通常推論されます。 - メソッドのパラメーターには型注釈が必要です。
- 型推論では、共通する最も具体的な型が選ばれます。
- 公開APIでは、または推論結果が意外な場合は、明示的に型注釈を付けてください。
よくある質問
「型推論」レッスンは無料ですか?
はい。「型推論」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Scala for Backend Engineering & Functional Programmingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Scala for Backend Engineering & Functional Programmingコースには全4レッスンが含まれています。
「型推論」で何を学びますか?
コンパイラーに型を推論させます。 ブラウザで直接実行するハンズオンコードでScala for Backend Engineering & Functional Programmingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Scala for Backend Engineering & Functional Programmingを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのScala for Backend Engineering & Functional Programmingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「型推論」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このScala for Backend Engineering & Functional Programmingレッスンでコードを書いて実行できますか?
はい。すべてのScala for Backend Engineering & Functional Programmingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。