Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

varval

当标识符保存数据时,您必须决定它是否可以重新赋值。

您创建标识符来引用程序中的元素。对于数据标识符来说,最基本的决策是它是否可以在程序执行过程中更改其内容,或者是否只能被赋值一次。这由两个关键字控制:

  • var,代表变量,意味着您可以重新赋值其内容。
  • val,代表,意味着您只能初始化它;不能重新赋值。

您可以像这样定义一个var

var 标识符 = 初始化值

var关键字后面是标识符,等号和初始化值。标识符以字母或下划线开头,后跟字母、数字和下划线。区分大小写(因此thisvaluethisValue是不同的)。

这里是一些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] 创建一个名为wholevar,并将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 += 3sum = 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找到。