Scala中的var和val定义有什么区别?为什么这两种定义都需要?为什么你会选择val而不是var,反之亦然?


当前回答

区别在于var可以被重新赋值,而val则不能。可变性,或其他任何实际分配的东西,是一个次要问题:

import collection.immutable
import collection.mutable
var m = immutable.Set("London", "Paris")
m = immutable.Set("New York") //Reassignment - I have change the "value" at m.

而:

val n = immutable.Set("London", "Paris")
n = immutable.Set("New York") //Will not compile as n is a val.

因此:

val n = mutable.Set("London", "Paris")
n = mutable.Set("New York") //Will not compile, even though the type of n is mutable.

如果您正在构建一个数据结构,并且它的所有字段都是val,那么该数据结构因此是不可变的,因为它的状态不能改变。

其他回答

简单来说:

var = 变量

Val =变量+ final

从c++的角度思考,

val x: T

是否类似于指向非常量数据的常量指针

T* const x;

var x: T 

类似于指向非常量数据的非常量指针吗

T* x;

偏好val而不是var增加了代码库的不可变性,这有助于它的正确性、并发性和可理解性。

要理解常量指针指向非常量数据的含义,请考虑以下Scala代码片段:

val m = scala.collection.mutable.Map(1 -> "picard")
m // res0: scala.collection.mutable.Map[Int,String] = HashMap(1 -> picard)

这里的“指针”val m是常量,所以我们不能将它重新赋值为指向其他东西

m = n // error: reassignment to val

但是我们确实可以改变m指向的非常数数据本身

m.put(2, "worf")
m // res1: scala.collection.mutable.Map[Int,String] = HashMap(1 -> picard, 2 -> worf)

Val表示不可变,var表示可变。

完整的讨论。

Val是最终值,即不能设置。在java中考虑final。

Val表示不可变,var表示可变

您可以将val视为Java编程语言的final key world或c++语言的const key world。