Skip to content

Scala 快速指南

Scala (Scalable Language,可伸缩语言) 是一种现代、多范式编程语言,旨在以简洁、优雅和类型安全的方式表达常见的编程模式。由 Martin Odersky 创建,于 2003 年首次发布。

要开始使用 Scala 进行开发,你需要在系统上安装 Java Development Kit (JDK) 和 Scala 构建工具。

Scala 语法借鉴了 Java,但添加了函数式元素,并力求简洁。主要区别包括分号可选、类型推断以及面向表达式的编程。

Scala 拥有丰富的类型系统,其中每个值都是一个对象。与 Java 区分基本类型和对象类型不同,Scala 统一了这些概念。像 Int、Double、Boolean 这样的基本数据类型都是类,继承自 AnyVal。

变量是用于存储值的命名内存位置。在 Scala 中,变量使用 val (不可变,首选) 或 var (可变) 来声明。

Scala 使用访问修饰符来控制类、特征 (trait) 和对象成员的可见性:private、protected 和默认 (public)。Scala 还支持带范围的修饰符,如 private[package] 或 protected[this],以实现更精细的控制。

Scala 中的运算符通常只是方法。Scala 支持标准的算术、关系、逻辑、位运算和赋值运算符。任何只有一个参数的方法都可以使用中缀表示法 (infix notation) (例如,a + b 就是 a.+(b))。

条件逻辑通过 if、else if 和 else 处理。重要的是,Scala 中的 if-else 结构是表达式,这意味着它们会求值为一个值。

虽然 Scala 支持像 while 和 do-while 这样的命令式循环结构,但惯用的 Scala 代码通常更倾向于使用函数式方法进行迭代,主要是通过 for 推导式 (for comprehensions) 和集合方法 (foreach, map, filter 等) 来实现。

函数是 Scala 中基础的构建块,用于封装执行特定任务的可重用代码块。Scala 支持方法 (methods),即与类或对象关联的函数,以及函数值 (function values) (或函数字面量,function literals),它们本身就是对象。

闭包 (Closure) 是指引用了在其自身函数体之外定义变量 (称为自由变量) 的函数。函数“关闭”了这些变量,意味着即使函数在其定义范围之外执行,它仍然保留对这些变量的访问权限。

在 Scala 中,字符串是字符序列,由 String 类型表示,该类型直接由 Java 的 java.lang.String 支持。这意味着 Scala 字符串是不可变 (immutable) 的,并且你可以访问所有标准的 Java String 方法,此外还有强大的特性,如字符串插值 (String Interpolation)。

Scala 中的 Array[T] 是一个可变 (mutable)、固定大小、带索引 (indexed) 的 T 类型元素序列。数组通过索引 (从 0 开始) 提供高效的随机访问。它们直接映射到 Java 数组。

Scala 提供了一个丰富、强大且全面的集合库,区分可变 (mutable) 和不可变 (immutable) 集合。在函数式编程中首选不可变集合。

Scala 是一种纯粹的面向对象语言,这意味着每个值都是一个对象。类用作创建这些对象的蓝图,定义它们的状态 (字段) 和行为 (方法)。单例对象 (object) 替代了静态成员,并提供了伴生对象 (companion objects)。

特征 (Traits) 是 Scala 类型系统的一个基本特性,类似于 Java 8+ 的接口,但功能更强大。它们允许定义可重用的字段和方法集,这些集可以混合 (mix) 到类中。

模式匹配 (Pattern matching) 是 Scala 最强大且最常用的特性之一。它允许你将一个值与一系列模式进行检查,并执行相应的代码块,从而简化复杂的条件逻辑。

Scala 通过 scala.util.matching.Regex 类提供内置的正则表达式支持,通常可以使用字符串的 .r 方法轻松创建。

像 Java 和其他语言一样,Scala 使用异常来处理中断程序正常执行流的错误。它使用 try-catch-finally 块,其中 catch 部分采用模式匹配。通常更推荐使用函数式替代方案,如 Try、Either 和 Option。

提取器 (Extractors) 是带有 unapply 方法的对象,常用于在模式匹配中解构值。 Case class 会自动提供提取器。

Scala 中的文件输入/输出 (I/O) 通常涉及使用 Java 的 java.io 类,但会用 Scala 特性进行包装,以实现更好的资源管理和集成。 scala.io.Source 对象提供了便捷的方式来读取文件。