第2步 定义变量
Scala的变量分为两种:val和var。val与Java的final变量类似,一旦初始化就不能被重新赋值。而var则不同,类似于Java的非final变量,在整个生命周期内都可以被重新赋值。下面是val的定义:
这行代码引入了msg这个变量名来表示"Hello, world!"这个字符串。msg的类型是java.lang.String,因为在JVM平台上,Scala的字符串是用Java的String类实现的。
如果你习惯于Java声明变量的方式,则会注意到一个显著的差别:在val的定义中,既没有出现java.lang.String,也没有出现String。这个示例展示了Scala的类型推断(type inference)能力——能够推断出那些不显式指定的类型。在本例中,由于使用的是字符串字面量来初始化msg,因此Scala推断出msg的类型是String。当Scala解释器能够推断类型时,通常来说,我们最好让它帮我们推断类型,而不是在代码中到处写上那些不必要的、显式的类型标注。当然,也可以显式地给出类型,有时候这样做可能是正确的选择。显式的类型标注,既可以确保Scala解释器推断出符合你意图的类型,也能作为文档,方便之后阅读代码的人更好地理解代码。与Java不同,Scala并不是在变量名之前给出类型的,而是在变量名之后给出类型的,且变量名和类型之间用冒号(:)隔开。例如:
或者(因为java.lang包中的类型可以在Scala程序中直接用简称[5]引用):
回到最初的msg,既然已经定义好,我们就可以正常地使用它,例如:
由于msg是val而不是var,因此并不能对它重新赋值。[6]举例来说,我们尝试如下代码,看解释器会不会报错:
如果你就是想重新赋值,则需要用var,就像这样:
由于greeting是var而不是val,因此可以在定义和初始化之后对它重新赋值。如果对greeting的内容不满意,则可以随时修改greeting的值。
要想在解释器中分多行录入代码,只需要在输出第一行代码之后直接按Enter键即可。如果当前输入的内容不完整,则解释器会自动在下一行的头部加上竖线(|)。
如果你意识到输错了,但解释器还在等待你的输入,则可以通过连续按两次Enter键来退出:
在后面的章节中,为了代码更好读(同时方便大家从PDF文件中复制、粘贴),将不再列出竖线(|)。