Scala 类型系统入门:变量声明、内置数据类型与字符串处理详解

顾星河
顾星河
发布时间:2026-08-24| 72人浏览过
原创

前言

很多人刚接触 Scala 时,最容易混淆的其实不是高级特性,而是最基础的几件事:变量该用 `val` 还是 `var`、类型到底要不要手写、数字和字符串默认会被推断成什么类型。本文按“变量声明、类型推断、内置数据类型、字符串处理、大数支持”这条线重新梳理,保留原始示例代码,帮助你快速建立一套能直接上手的判断规则。

Scala 变量怎么声明:先分清 `val` 和 `var`

在 Scala 里,初学者最先遇到的不是复杂类型系统,而是变量该怎么定义。这里首先要分清两种变量声明方式:val 用于不可变变量,var 用于可变变量。

val 的作用类似 Java 里的 final:变量一旦绑定,就不能重新赋值;而 var 允许后续修改。

// immutable
val s = "hello"
s = "hello, world" // compile error: reassignment to val

val dog = new Dog("Tom")

// mutable
var i = 123
i = 456            // compile pass

实际开发里,val 往往是更常见的选择,因为不可变数据更容易推导,也更不容易引入副作用。只有在确实需要修改值时,再考虑使用 var。

Scala 需要显式写类型吗:多数时候不用

Scala 编译器可以根据 = 右侧的值自动推断变量类型,所以很多场景下不必手动标注类型。这也是 Scala 代码通常比传统强类型语言更紧凑的原因之一。

Scala 变量声明与类型推断关系图,展示 val、var 以及显式标注与自动推断的适用场景。
Scala 变量声明与类型推断速览用一张图看清 Scala 里变量可变性与类型声明的基本规则。
val s: String = "hello"
var i: Int = 123

上面这种写法当然是允许的,但如果类型一眼就能看出来,显式声明通常会显得冗余。多数情况下,直接交给编译器推断即可。

什么情况下建议把类型写出来

虽然“让编译器推断”是默认推荐,但显式标注类型并不是没有意义。尤其在调用第三方库时,如果方法返回值不直观,或者 API 命名不能清楚说明结果类型,手动写出类型通常能明显提升可读性。

相比事后再用注释解释,直接把类型写在变量声明里,往往更符合“见名知意”的代码风格。

Scala 有哪些内置数据类型

Scala 内置了不少基础数据类型,而且这些类型都被封装为成熟的 object,并不是传统意义上的原始类型(如 int、float)。

Scala 内置数据类型与默认字面量类型的信息图,区分整数、小数和其他基本类型。
Scala 内置类型与默认规则Scala 字面量并非都要手写类型,但默认归属要先掌握。

整数类型:默认是 `Int`

下面这些都属于整数类型:

val b: Byte = 1
val i: Int = 1
val l: Long = 1
val s: Short = 1

其中,整数字面量默认会被推断为 Int。如果你希望变量是 Byte、Long 或 Short,就需要通过 : {数据类型} 的方式显式声明。

小数类型:默认是 `Double`

小数字面量的默认类型是 Double。如果希望使用 Float,同样需要显式标注:

val d = 2.0          // default "Double" type

val f: Float = 3.0   // set to `Float` type

另外三类常用基本类型

除了整数和浮点数,Scala 也内置了 Boolean、String、Char:

val b = true         // default "Boolean" type

val s = "hello"      // default "String" type

val c = 'a'          // default "Char" type

9 种基本数据类型的值范围

原文同时给出了 Scala 官方对 9 种基本数据类型取值范围的说明,保留如下:

Data TypePossible Values
Booleantrue or false
Byte8-bit signed two’s complement integer (-2^7 to 2^7-1, inclusive)
Short16-bit signed two’s complement integer (-2^15 to 2^15-1, inclusive)
Int32-bit two’s complement integer (-2^31 to 2^31-1, inclusive)
Long64-bit two’s complement integer (-2^63 to 2^63-1, inclusive)
Float32-bit IEEE 754 single-precision float (1.40129846432481707e-45 to 3.40282346638528860e+38)
Double64-bit IEEE 754 double-precision float (4.94065645841246544e-324d to 1.79769313486231570e+308d)
Char16-bit unsigned Unicode character (0 to 2^16-1, inclusive)
Stringa sequence of Char

Scala 字符串怎么处理

字符串是 Scala 中最常见的日常操作之一。原文重点介绍了几种字符串拼接、插值和多行文本处理方式,这部分很适合放在一起理解。

Scala 字符串处理方式对比图,展示加号拼接、s 插值、f 插值和多行字符串 stripMargin。
Scala 字符串常见写法对比字符串是 Scala 日常开发高频语法,这几种写法的差异值得单独记住。

先定义两个字符串变量:

val firstName = "Shuai"
val lastName = "Li"

方法一:用 `+` 直接拼接

val name = firstName + " " + lastName  // Shuai Li

这种方式最直接,适合非常简单的拼接场景。

方法二:用 `s` 字符串插值

val name = s"$firstName $lastName"  // Shuai Li

s 插值比 + 更清晰,特别是在变量较多时更容易读。

变量也可以写成带花括号的形式:

val name = s"${firstName} ${lastName}"  // Shuai Li

更重要的是,花括号里不只是变量,还可以直接写表达式:

val calculation_description = s"1 + 1 = ${1 + 1}"  // 1 + 1 = 2

插值时的转义问题

使用 s 插值时,遇到特殊字符需要注意转义。例如金额里的 $:

println(s"The book is $$30.54")  // The book is $30.54

双引号也是常见问题。下面给出一个错误示例和一个可工作的示例:

println(s"The focus of this book is on "clean code".")  // compile error

println("""The focus of this book is on "clean code".""")  // The focus of this book is on "clean code".

也就是说,包含双引号的复杂字符串内容,可以借助 三重双引号 来处理。

方法三:用 `f` 做格式化插值

f 插值适合输出格式化字符串,风格接近其他语言里的 printf。使用时,变量后面需要追加格式说明符:

val money = 7.856
println(f"$name%s has $money%2.2f yuan left")  // Shuai Li has 7.86 yuan left

如果你既想保留插值的可读性,又需要控制小数位、宽度等输出格式,f 会比手工拼接更合适。

多行字符串与 `stripMargin`

Scala 可以直接用三个双引号来定义多行字符串:

val introduction =
  """My name
      is Shuai Li..."""
println(introduction)

输出结果如下:

My name
       is Shuai Li...

问题也很明显:除了第一行,后续各行会保留缩进。为了解决这个问题,可以在每行前加上 |,并调用 stripMargin:

val introduction =
  """My name
    |is Shuai Li...""".stripMargin
println(introduction)

输出会变成:

My name
is Shuai Li...

这也是 Scala 处理中长文本时很常见的一种写法。

大数场景怎么办:`BigInt` 和 `BigDecimal`

当内置整数或浮点类型无法满足精度和范围要求时,Scala 还提供了两种常见的大数类型:

  • BigInt:大整数
  • BigDecimal:大十进制数(小数)

和 Java 中对应类相比,Scala 里的这两种类型支持你熟悉的数值操作符,写法更自然。下面是原文给出的 REPL[1] 示例。

`BigInt` 示例

scala> val bi = BigInt(100000001)
val bi: scala.math.BigInt = 100000001

scala> bi + bi
val res2: scala.math.BigInt = 200000002

scala> bi - bi
val res3: scala.math.BigInt = 0

scala> bi * bi
val res4: scala.math.BigInt = 10000000200000001

`BigDecimal` 示例

scala> val bd = BigDecimal(10000.123)
val bd: scala.math.BigDecimal = 10000.123

scala> bd + bd
val res0: scala.math.BigDecimal = 20000.246

scala> bd * bd
val res1: scala.math.BigDecimal = 100002460.01512

如果你的代码涉及超大整数计算、高精度金额、统计结果累积等场景,这两种类型通常比普通数值类型更稳妥。

参考资料

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。