Scala 3 — 书籍

变量和数据类型

语言

本节介绍 Scala 变量和数据类型。

两种类型的变量

在 Scala 中创建新变量时,需要声明该变量是不可变的还是可变的

变量类型 说明
val 创建不可变变量——类似于 Java 中的 final。除非有理由需要可变变量,否则你应始终使用 val 创建变量。
var 创建可变变量,并且仅在变量内容会随时间变化时才应使用。

以下示例展示了如何创建 valvar 变量

// 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

因为 IntDouble 是默认数字类型,所以通常在不显式声明数据类型的情况下创建它们

val i = 123   // defaults to Int
val j = 1.0   // defaults to Double

在代码中,还可以将字符 LDF(及其小写等效项)附加到数字,以指定它们是 LongDoubleFloat

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

当需要非常大的数字时,请使用 BigIntBigDecimal 类型

var a = BigInt(1_234_567_890_987_654_321L)
var b = BigDecimal(123_456.789)

其中 DoubleFloat 是近似十进制数,BigDecimal 用于精确算术。

Scala 还有 StringChar 数据类型

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."""

有关字符串插值器和多行字符串的更多详细信息,请参阅 “初识类型” 章节

此页面的贡献者