1. 概要

このチュートリアルでは、メソッド、変数、値、および遅延値の類似点と相違点について説明します。

Scalaのコア機能の詳細については、イントロおよび怠惰なvalのガイドを参照してください。

2. メソッド

メソッドは遅延評価されます。つまり、と呼ばれるまで評価が遅れます。 コンソールに何かを出力するメソッドを作成することで、評価戦略を確認できます。

object Methods extends App {
  def method: Int = {
    println("method")
    1
  }

  println("After method declaration")
  println(method)
  println(method)
}

コンソール出力に基づいて、メソッドを呼び出すたびにメソッドが評価されることを確認します。

After method declaration
method
1
method
1

メソッドも不変であるため、作成後に値を変更することはできません。 これを実行しようとすると、コンパイラは「secretNumber_=はオブジェクトのメンバーではありません」というメッセージで失敗します。

def secretNumber: Int = 5
secretNumber = 1

3. 変数

変数は、メソッドとは異なり、熱心に評価しますそれらの評価は、宣言中に1回だけ行われます。

object Variables extends App {
  var variable: Int = {
    println("variable")
    1
  }

  println("After variable declaration")
  println(variable)
  println(variable)
}

変数の評価は、宣言中に1回だけ行われることがわかります。

variable
After variable declaration
1
1

メソッドとは異なり、変数は作成後に値を変更できるため、変更可能です。

var secretNumber: Int = 5
secretNumber = 1

4. 値

変数と同様に、値は宣言中に評価が行われるため、熱心に評価されます。

object Values extends App {
  val value: Int = {
    println("value")
    1
  }

  println("After value declaration")
  println(value)
  println(value)
}

コンソール出力:

value
After value declaration
1
1

一方、変数とは異なり、値は不変です。 新しい値を割り当てようとすると、コンパイラは「valへの再割り当て」メッセージで失敗します。

val secretNumber: Int = 5
secretNumber = 2

5. 怠惰な値

レイジー値にはエキサイティングな特性があります。 値とは異なり、それらは遅延評価されますが、メソッドとは対照的に、評価は1回だけ行われます。

object LazyValues extends App {
  lazy val lazyValue: Int = {
    println("lazy value")
    1
  }

  println("After lazy value declaration")
  println(lazyValue)
  println(lazyValue)
}

評価は、lazyValueの最初の使用時に発生することがわかります。

After lazy value declaration
lazy value
1
1

一方、怠惰な値は不変です。 値と同様に、新しい値を値に割り当てようとすると、コンパイラは「valへの再割り当て」メッセージで失敗します。

lazy val secretNumber: Int = 5
secretNumber = 1

6. 結論

この短いチュートリアルでは、メソッド、変数、値、および遅延値の類似点と相違点について学習しました。 私たちは彼らの評価戦略と可変性に焦点を合わせました。

いつものように、このチュートリアルで使用されているすべての例を含むソースコードは、GitHubからで入手できます。