本节介绍 Scala 变量和数据类型。
两种类型的变量
在 Scala 中创建新变量时,需要声明该变量是不可变的还是可变的
变量类型 | 说明 |
---|---|
val |
创建不可变变量——类似于 Java 中的 final 。除非有理由需要可变变量,否则你应始终使用 val 创建变量。 |
var |
创建可变变量,并且仅在变量内容会随时间变化时才应使用。 |
以下示例展示了如何创建 val
和 var
变量
// immutable
val a = 0
// mutable
var b = 1
在应用程序中,不能重新分配 val
。如果你尝试重新分配一个 val
,将会导致编译器错误
val msg = "Hello, world"
msg = "Aloha" // "reassignment to val" error; this won’t compile
相反,可以重新分配 var
var msg = "Hello, world"
msg = "Aloha" // this compiles because a var can be reassigned
声明变量类型
创建变量时,可以明确声明其类型,或让编译器推断类型
val x: Int = 1 // explicit
val x = 1 // implicit; the compiler infers the type
第二种形式称为类型推断,这是一种帮助保持此类代码简洁的好方法。Scala 编译器通常可以为你推断数据类型,如这些 REPL 示例的输出所示
scala> val x = 1
val x: Int = 1
scala> val s = "a string"
val s: String = a string
scala> val nums = List(1, 2, 3)
val nums: List[Int] = List(1, 2, 3)
如果你愿意,可以始终明确声明变量的类型,但在像这些简单的赋值中,这是没有必要的
val x: Int = 1
val s: String = "a string"
val p: Person = Person("Richard")
请注意,使用这种方法,代码感觉比必要时冗长。
内置数据类型
Scala 随附了您期望的标准数字数据类型,并且它们都是类的完整实例。在 Scala 中,一切都是对象。
这些示例展示了如何声明数字类型的变量
val b: Byte = 1
val i: Int = 1
val l: Long = 1
val s: Short = 1
val d: Double = 2.0
val f: Float = 3.0
因为 Int
和 Double
是默认数字类型,所以通常在不显式声明数据类型的情况下创建它们
val i = 123 // defaults to Int
val j = 1.0 // defaults to Double
在代码中,还可以将字符 L
、D
和 F
(及其小写等效项)附加到数字,以指定它们是 Long
、Double
或 Float
值
val x = 1_000L // val x: Long = 1000
val y = 2.2D // val y: Double = 2.2
val z = 3.3F // val z: Float = 3.3
当需要非常大的数字时,请使用 BigInt
和 BigDecimal
类型
var a = BigInt(1_234_567_890_987_654_321L)
var b = BigDecimal(123_456.789)
其中 Double
和 Float
是近似十进制数,BigDecimal
用于精确算术。
Scala 还有 String
和 Char
数据类型
val name = "Bill" // String
val c = 'a' // Char
字符串
Scala 字符串类似于 Java 字符串,但它们有两个很棒的附加功能
- 它们支持字符串插值
- 可以轻松创建多行字符串
字符串插值
字符串插值提供了一种非常可读的方式来在字符串中使用变量。例如,给定这三个变量
val firstName = "John"
val mi = 'C'
val lastName = "Doe"
您可以像这样将这些变量组合成一个字符串
println(s"Name: $firstName $mi $lastName") // "Name: John C Doe"
只需在字符串前加上字母 s
,然后在字符串内的变量名前加上 $
符号即可。
要在字符串内嵌入任意表达式,请用大括号将它们括起来
println(s"2 + 2 = ${2 + 2}") // prints "2 + 2 = 4"
val x = -1
println(s"x.abs = ${x.abs}") // prints "x.abs = 1"
您在字符串前放置的 s
只是一个可能的插值器。如果您使用 f
而不是 s
,则可以在字符串中使用 printf
样式的格式化语法。此外,字符串插值器只是一个特殊方法,可以定义您自己的插值器。例如,一些数据库库定义了非常强大的 sql
插值器。
多行字符串
通过将字符串包含在三个双引号内来创建多行字符串
val quote = """The essence of Scala:
Fusion of functional and object-oriented
programming in a typed setting."""
有关字符串插值器和多行字符串的更多详细信息,请参阅 “初识类型” 章节。