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

valとvar

不変と可変のバインディング。

「valとvar」は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レッスンが含まれています。

値に名前を付ける2つの方法

Scala では、valまたはvarを使って値に名前を束縛します。

valは不変の束縛を作ります。一度代入すると、別の値を指すことはありません。varは、後から再代入できる可変の束縛を作ります。

どちらを選ぶかは、Scala のバックエンドエンジニアが最初に身につける習慣の一つです。

val name = "Ada"
var score = 10

val の定義

valは読み取り専用です。一度だけ代入し、その値が変わらないことをコンパイラーが保証します。

これによりコードを理解しやすくなります。valの値が、別の場所で変わっていて驚かされることはありません。

object Main extends App {
  val pi = 3.14
  println(pi)
}

val の再代入は失敗する

valに再代入しようとすると、実行時のクラッシュではなくコンパイルエラーになります。プログラムが実行される前に、コンパイラーが阻止します。

以下のスニペットは reassignment to val というエラーになります。

val country = "Turkey"
country = "Spain" // error: reassignment to val

var の定義

varには、新しい値が互換性のある型である限り、何度でも再代入できます。

ループ内のカウンターのように、時間の経過とともに本当に値を変える必要がある場合にvarを使います。

object Main extends App {
  var count = 0
  count = count + 1
  count = count + 1
  println(count)
}

var の型は変わらない

varは再代入できますが、型は定義時に固定されます。

levelが最初にIntとして始まった場合、後からStringを格納することはできません。コンパイラーが型の不一致を拒否します。

var level = 1
level = 5        // ok, still an Int
level = "high"  // error: type mismatch

デフォルトでは val を優先する

Scala では、ほぼすべての場面でvalを使うのが慣用的です。不変性により、バグの種類全体を避けられ、並行コードも安全になります。

  • まずvalを使います。
  • 本当に変更が必要な場合だけvarに切り替えます。

var を val に書き換える

varが必要に見える多くのループは、代わりにvalと式で表現できます。

ここでは、変更を使わずに範囲とsumで合計を計算しています。

object Main extends App {
  val total = (1 to 5).sum
  println(total)
}

束縛のスコープ

valとvarはどちらも、定義されたブロック{ ... }の中で有効です。

ブロック内で宣言した束縛は、その外側からは見えません。これにより名前が整理され、意図しない再利用も防げます。

object Main extends App {
  val outer = 1
  {
    val inner = 2
    println(outer + inner)
  }
  // inner is not visible here
}

遅延 val

lazy valは、最初に使われたときだけ計算され、その後はキャッシュされます。

これは、常に必要とは限らない計算コストの高い値に便利です。本体は最大で一度しか実行されません。

object Main extends App {
  lazy val greeting = { println("computing"); "Hi" }
  println("before")
  println(greeting)
  println(greeting)
}

明示的な型を指定した val

コロンの後に束縛の型を注釈として指定できます。これにより意図を文書化でき、意図的に型を広げることもできます。

ここでは、10はIntに見えますが、amountをDoubleとして宣言しています。

val amount: Double = 10
val label: String = "price"

val と var の比較

再代入を試みるまでは、2つの動作は同じです。

  • val x:一度だけ代入し、その後は固定されます。
  • var y:自由に代入・再代入できます。

以下のプログラムでインクリメントされるのはvarだけです。

object Main extends App {
  val base = 100
  var bonus = 0
  bonus = bonus + 25
  println(base + bonus)
}

理解度チェック

valとvarについての理解度を確認しましょう。

まとめ

Scala で名前を束縛する2つの方法を学びました。

  • valは不変で、デフォルトの選択肢です。
  • varは可変で、変更が必要な値に限定して使います。
  • valへの再代入はコンパイルエラーです。
  • どちらも型は固定され、lazy valは計算を遅延させます。

よくある質問

「valとvar」レッスンは無料ですか?

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

「valとvar」で何を学びますか?

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

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

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

「valとvar」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. valとvar
  2. 基本型とリテラル
  3. 型推論
  4. 文より式
← Scala for Backend Engineering & Functional Programmingに戻る