var 和 val
当标识符保存数据时,您必须决定它是否可以重新赋值。
您创建标识符来引用程序中的元素。对于数据标识符来说,最基本的决策是它是否可以在程序执行过程中更改其内容,或者是否只能被赋值一次。这由两个关键字控制:
var,代表变量,意味着您可以重新赋值其内容。val,代表值,意味着您只能初始化它;不能重新赋值。
您可以像这样定义一个var:
var 标识符 = 初始化值
var关键字后面是标识符,等号和初始化值。标识符以字母或下划线开头,后跟字母、数字和下划线。区分大小写(因此thisvalue和thisValue是不同的)。
这里是一些var定义的示例:
// VarAndVal/Vars.kt
fun main() {
var whole = 11 // [1]
var fractional = 1.4 // [2]
var words = "Twas Brillig" // [3]
println(whole)
println(fractional)
println(words)
}
/* 输出:
11
1.4
Twas Brillig
*/
在本书中,我们使用带有注释的方括号标记行号,以便我们可以在文本中引用它们,如下所示:
- [1] 创建一个名为
whole的var,并将11存储在其中。 - [2] 在
var fractional中存储“分数”1.4。 - [3] 在
var words中存储一些文本(String)。
请注意,println()可以将任何单个值作为参数。
正如名称“变量”所暗示的那样,var是可变的。也就是说,您可以更改存储在var中的数据。我们说var是可变的:
// VarAndVal/AVarIsMutable.kt
fun main() {
var sum = 1
sum = sum + 2
sum += 3
println(sum)
}
/* 输出:
6
*/
赋值语句sum = sum + 2获取sum的当前值,加上2,并将结果重新赋值给sum。
赋值语句sum += 3与sum = sum + 3的意思相同。+=运算符获取sum中存储的先前值,并将其增加3,然后将新的结果赋值回sum。
更改var中存储的值是表示变化的一种有用方式。然而,当程序的复杂性增加时,如果您的标识符表示的值不能更改,即不能重新分配,您的代码将更清晰、更安全、更易于理解。我们使用val关键字而不是var来指定一个不可变的标识符。val只能在创建时被赋值一次:
val identifier = initialization
val关键字来自于"value",表示不可变的、不能改变的内容。选择使用val而不是var是一个很好的选择。在本节的开始处,Vars.kt示例可以使用val进行重写:
// VarAndVal/Vals.kt
fun main() {
val whole = 11
// whole = 15 // Error // [1]
val fractional = 1.4
val words = "Twas Brillig"
println(whole)
println(fractional)
println(words)
}
/* 输出:
11
1.4
Twas Brillig
*/
- [1] 一旦你初始化了一个
val,你就不能重新分配它。如果我们尝试将whole重新分配给一个不同的数字,Kotlin会报错,显示“Val cannot be reassigned.”(不能重新分配val)。
选择描述性的名称作为你的标识符可以使你的代码更易于理解,并且通常减少了对注释的需求。在Vals.kt中,你无法知道whole代表什么。如果你的程序将数字11存储为表示喝咖啡的时间,那么如果你将其命名为coffeetime,那么对其他人来说更明显,如果它是coffeeTime(遵循Kotlin的风格,我们将首字母小写)。
var在程序运行时数据必须发生变化时很有用。这听起来像是一个常见的要求,但实际上在实践中可以避免。通常情况下,如果你使用val,你的程序更容易扩展和维护。然而,在极少数情况下,使用val无法解决问题的复杂性。因此,Kotlin给你提供了使用var的灵活性。然而,当你花费更多时间使用val时,你会发现几乎不需要使用var,而且没有var的程序更安全可靠。
练习和解答可以在www.AtomicKotlin.com找到。