Scala中的var和val定义有什么区别?为什么这两种定义都需要?为什么你会选择val而不是var,反之亦然?
当前回答
从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)
其他回答
简单来说:
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表示不可变,var表示可变。
完整的讨论。
Val值是类型存储常量。一旦创建它的价值不能重新分配。可以用关键字val定义一个新值。
如。val x: Int = 5
这里type是可选的,因为scala可以从赋值推断它。
变量是类型化的存储单元,只要保留内存空间,就可以再次为其赋值。
如。var x: Int = 5
一旦不再需要存储在这两个存储单元中的数据,JVM就会自动取消对它们的分配。
在scala中,值比变量更受欢迎,因为它们给代码带来了稳定性,尤其是在并发和多线程代码中。
推荐文章
- Akka Kill vs Stop vs Poison Pill?
- 如何开始与Akka流?
- Scala 2.8 breakOut
- 如何克隆一个案例类实例,只改变一个字段在Scala?
- ':_* '(冒号下划线*)在Scala中有什么作用?
- 定义一个函数时,“def”和“val”有什么区别
- 在Scala中获取列表中的项目?
- case对象和对象的区别
- Scala中的Case对象与枚举
- 任务不可序列化:java.io.NotSerializableException,当只对类而不是对象调用闭包外部的函数时
- 在Scala中将一个元素附加到列表的末尾
- 在Scala中按名称调用vs按值调用,需要澄清
- 解析命令行参数的最佳方法?
- Android Scala编程
- lazy val做什么?