Scala for Backend Engineering & Functional Programming · 课时

以表达式为主,而非语句

一切都会返回一个值。

第 4 / 4 课13 个步骤

以表达式为主,而非语句 是 CoddyKit 上的免费 Scala for Backend Engineering & Functional Programming 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Scala for Backend Engineering & Functional Programming 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Scala for Backend Engineering & Functional Programming 课程共包含 4 节课。

一切皆为表达式

在许多语言中,if 和代码块是只执行操作但不产生值的语句。而在 Scala 中,它们是计算出一个值的表达式。

这种转变是 Scala 函数式编程的核心。

val max = if (3 > 2) 3 else 2

作为表达式的 if

Scala 中的 if/else 会返回所执行分支的值。您可以直接将这个结果赋给 val。

不需要声明一个可变变量,再在各个分支中为它赋值。

object Main extends App {
  val temp = 18
  val label = if (temp > 20) "warm" else "cool"
  println(label)
}

代码块返回最后一行的值

代码块 { ... } 本身就是一个表达式。它的值就是其中最后一个表达式的值。

这里的代码块计算结果为 30,随后成为 result 的值。

object Main extends App {
  val result = {
    val a = 10
    val b = 20
    a + b
  }
  println(result)
}

不需要显式使用 return

由于方法体是一个表达式,它的值就是最后计算出的表达式的值。return 关键字很少使用。

下面两个方法的行为相同,但符合惯用写法的方法省略了 return。

def double(x: Int) = x * 2
// instead of: def double(x: Int) = { return x * 2 }

match 也是表达式

使用 match 进行模式匹配同样会产生一个值,因此非常适合将输入映射为结果。

每个 case 分支都会产生该分支对应的值。

object Main extends App {
  val day = 3
  val name = day match {
    case 1 => "Mon"
    case 3 => "Wed"
    case _ => "Other"
  }
  println(name)
}

表达式可以组合

由于表达式会返回值,因此您可以自由地嵌套和组合它们。

if 可以作为函数的参数,也可以成为更大计算的一部分,而不需要临时变量。

object Main extends App {
  val n = 7
  println("sign: " + (if (n >= 0) "+" else "-"))
}

语句仍然存在

并非所有内容都会产生有用的值。仅为产生副作用而执行的操作(例如 println 或赋值)会计算为 Unit。

这些就是 Scala 中类似语句的表达式。

val x: Unit = println("hello") // value is ()

使用表达式避免 var

表达式风格可以替代可变的 var 写法。不要声明一个 var 再在各个分支中赋值,而是将整个 if 赋给一个 val。

object Main extends App {
  val score = 85
  val grade = if (score >= 90) "A" else if (score >= 80) "B" else "C"
  println(grade)
}

for 可以产生值

带有 yield 的 for 是一个用于构建新集合的表达式,而不只是为了副作用进行循环。

这样,迭代就变成了能够产生值的转换。

object Main extends App {
  val squares = for (i <- 1 to 4) yield i * i
  println(squares)
}

这对后端代码为何重要

以表达式为中心的代码通常更短、需要处理的部分更少,也更容易进行测试。

  • 可变变量更少,错误也更少。
  • 结果会自然地从输入中产生。
  • 它能很好地与 Scala 的函数式库组合使用。

语句风格与表达式风格

比较这两种思路。语句风格会修改变量;表达式风格会直接返回值。

Scala 两种方式都支持,但更偏好表达式风格。

var s = ""            // statement style
if (true) s = "yes" else s = "no"

val e = if (true) "yes" else "no" // expression style

快速检查

在 Scala 中,if/else 的计算结果是什么?

回顾

Scala 更偏好能够产生值的表达式,而不是只修改状态的语句。

  • if、match、代码块和 for/yield 都会返回值。
  • 方法体会返回最后一个表达式的值;很少需要使用 return。
  • 产生副作用的代码会返回 Unit。
  • 这种风格可以减少 var 的使用和错误。
免费开始

用 AI 导师学习 Scala — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
39
课程
143

常见问题解答

「以表达式为主,而非语句」课时是免费的吗?

是的 — 「以表达式为主,而非语句」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Scala for Backend Engineering & Functional Programming 课程的其余内容,请升级到 CoddyKit PRO。 Scala for Backend Engineering & Functional Programming 课程共包含 4 节课。

「以表达式为主,而非语句」这节课中我会学到什么?

一切都会返回一个值。 你通过在浏览器中直接运行的动手代码来练习 Scala for Backend Engineering & Functional Programming,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Scala for Backend Engineering & Functional Programming 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Scala for Backend Engineering & Functional Programming 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「以表达式为主,而非语句」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Scala for Backend Engineering & Functional Programming 课中编写并运行代码吗?

能。每节 Scala for Backend Engineering & Functional Programming 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. val 与 var
  2. 基本类型和字面量
  3. 类型推断
  4. 以表达式为主,而非语句
← 返回 Scala for Backend Engineering & Functional Programming