Scala编程(第4版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第2步 定义变量

Scala的变量分为两种:valvarval跟Java的final变量类似,一旦初始化就不能被重新赋值。而var则不同,类似于Java的非final变量,在整个生命周期内var可以被重新赋值。如下是val的定义:

这行代码引入了msg这个变量名来表示"Hello, world!"这个字符串。msg的类型是java.lang.String,因为Scala的字符串是用Java的String类实现的。

如果你习惯于Java声明变量的方式,你会注意到一个显著的差别:在val的定义中,既没有java.lang.String,也没有String。这个示例展示了Scala的类型推断type inference)能力——能够推断出那些不显式指定的类型。在本例中,由于是用字符串字面量来初始化msg,Scala推断出msg的类型是String。当Scala的解释器(或编译器)能够推断类型的时候,通常来说我们最好让它帮我们推断类型,而不是在代码中到处写上那些不必要的、显式的类型标注。当然也可以显式地给出类型,有时候可能这样做是正确的选择。显式的类型标注,既可以确保Scala编译器推断出符合你意图的类型,也能作为文档,方便今后阅读代码的人更好地理解代码。跟Java不同,Scala并不是在变量名之前给出类型,而是在变量名之后,变量名和类型之间用冒号(:)隔开。例如:

或者(因为java.lang包中的类型可以在Scala程序中直接用简称[4]引用):

回到最初的msg,既然已经定义好,就可以正常地使用它,例如:

由于msgval而不是var,并不能对它重新赋值。[5]举例来说,尝试如下代码,看编译器会不会报错:

如果你就是想重新赋值,那么需要用var,就像这样:

由于greetingvar而不是val,可以在定义和初始化之后对它重新赋值。如果对greeting的内容不满意,可以随时修改greeting的值。

要在解释器中分多行录入代码,只需要在第一行之后直接按回车继续就好。如果当前键入的内容不完整,解释器会自动在下一行的头部加上竖线(|)。

如果你意识到输错了,但解释器还在等待你的输入,可以通过连敲两次回车来退出:

在后面的章节中,为了代码更好读(同时也方便大家从PDF复制粘贴)我们将不再列出竖线(|)。