まず、Scalaに存在するdef、val、varの違いから始めます。
DEF -定義不変ラベルされた右側のコンテンツの遅延評価を -名前で評価します。
val- すぐに評価される右側のコンテンツの不変のラベルを定義します-値によって評価されます。
varが -定義変更可能な変数を最初に評価され、右側のコンテンツに設定され、。
例、def
scala> def something = 2 + 3 * 4
something: Int
scala> something // now it's evaluated, lazily upon usage
res30: Int = 14
例、val
scala> val somethingelse = 2 + 3 * 5 // it's evaluated, eagerly upon definition
somethingelse: Int = 17
例、var
scala> var aVariable = 2 * 3
aVariable: Int = 6
scala> aVariable = 5
aVariable: Int = 5
上記によると、defとvalからのラベルは再割り当てできず、何らかの試みがあった場合、以下のようなエラーが発生します:
scala> something = 5 * 6
<console>:8: error: value something_= is not a member of object $iw
something = 5 * 6
^
クラスが次のように定義されている場合:
scala> class Person(val name: String, var age: Int)
defined class Person
次にインスタンス化します:
scala> def personA = new Person("Tim", 25)
personA: Person
不変のラベルは、人(すなわち「ペルソナ」)の特定のインスタンスのために作成されています。可変フィールド「年齢」を変更する必要がある場合は常に、このような試みは失敗します。
scala> personA.age = 44
personA.age: Int = 25
予想通り、「年齢」は変更不可能なラベルの一部です。これに対処する正しい方法は、次の例のように、可変変数を使用することです。
scala> var personB = new Person("Matt", 36)
personB: Person = Person@59cd11fe
scala> personB.age = 44
personB.age: Int = 44 // value re-assigned, as expected
明らかなように、可変変数参照(つまり、「personB」)から、クラスの可変フィールド「age」を変更することが可能です。
私はまだすべてが上記の違いから来るという事実を強調します、それはどんなScalaプログラマーの心にも明確でなければなりません。
val
変更できますが、valによって参照されるオブジェクトは変更できません。Aval
は定数ではありません。