1Scala for the Impatient(第2版)

基础

Scala入门

val与var类型推断字符串插值REPL

🎯 AI 时代的学习建议:不要只读理论。理解这一章的设计动机(为什么需要这个概念?)和边界条件(什么情况下会失效?)。当 AI 生成的代码涉及这些概念时,你能判断它是否用对了场景。AI 能帮你总结内容,但无法替代你亲手阅读、思考、建立直觉的过程。

第1章:基础

一、导读

1.1 本章学习目标

第1章讲解 Scala 的基础语法:val/var、类型推断、字符串插值、REPL。

本章核心学习目标:

  • 理解 val 和 var 的区别:不可变 vs 可变
  • 掌握类型推断:Scala 如何推断类型
  • 理解 Scala 的表达式风格:几乎所有东西都是表达式
  • 掌握字符串插值

1.2 为什么本章如此重要

Scala 融合了面向对象和函数式编程。理解 val/var 和表达式风格是掌握 Scala 的基础。

1.3 核心问题引导

为什么 Scala 推荐使用 val 而非 var?

Scala 的类型推断如何工作?

if/for/try 在 Scala 中是表达式还是语句?


二、核心概念详解

2.1 val 和 var

scala
// val: 不可变绑定
val x = 42
// x = 43  // 编译错误: val 不能重新赋值

// var: 可变绑定
var y = 10
y = 20  // OK

// 推荐: 优先使用 val
// val 更安全、更容易推理、支持并发

// 类型声明 (可选)
val name: String = "Alice"
val age: Int = 30

2.2 类型推断

scala
// Scala 自动推断类型
val x = 42        // Int
val pi = 3.14     // Double
val greeting = "Hello"  // String
val flag = true   // Boolean

// 集合
val nums = List(1, 2, 3)        // List[Int]
val map = Map("a" -> 1, "b" -> 2)  // Map[String, Int]

// 函数
val add = (a: Int, b: Int) => a + b  // (Int, Int) => Int

2.3 表达式

scala
// if 是表达式,有返回值
val result = if (x > 0) "positive" else "non-positive"

// for 是表达式
val squares = for (i <- 1 to 5) yield i * i
// Vector(1, 4, 9, 16, 25)

// try 是表达式
val parsed = try {
    "42".toInt
} catch {
    case _: NumberFormatException => 0
}

// 块也是表达式
val answer = {
    val a = 10
    val b = 20
    a + b  // 最后一个表达式的值
}

2.4 字符串插值

scala
val name = "Alice"
val age = 30

// s 插值器
println(s"Name: $name, Age: $age")
println(s"Next year: ${age + 1}")

// f 插值器 (格式化)
val pi = 3.14159
println(f"Pi is approximately $pi%.2f")  // 3.14

// raw 插值器 (不处理转义)
println(raw"No\nnewline")  // No\nnewline

三、实战案例

3.1 案例一:FizzBuzz

scala
// 函数式风格
def fizzBuzz(n: Int): String = (n % 3, n % 5) match {
    case (0, 0) => "FizzBuzz"
    case (0, _) => "Fizz"
    case (_, 0) => "Buzz"
    case _      => n.toString
}

for (i <- 1 to 100) {
    println(fizzBuzz(i))
}

// 更简洁的版本
val result = (1 to 100).map { i =>
    val fizz = if (i % 3 == 0) "Fizz" else ""
    val buzz = if (i % 5 == 0) "Buzz" else ""
    val fb = fizz + buzz
    if (fb.isEmpty) i.toString else fb
}
result.foreach(println)

四、本章小结

val 不可变,var 可变,优先使用 val

Scala 有强大的类型推断

几乎所有结构都是表达式,有返回值


五、思考与练习

为什么不可变性对并发编程很重要?

Scala 的 Unit 类型和 Java 的 void 有什么区别?


1/7基础
0%