函数的返回值

42 阅读2分钟

1. 返回值的默认规则:最后一个表达式的值

Scala 函数的返回值默认是函数体中最后一个表达式的结果,无需显式使用 return 关键字(除非需要提前返回)。

// 函数体是单一表达式,返回该表达式结果
def add(a: Int, b: Int): Int = a + b  // 返回 a + b 的结果

// 函数体有多行时,返回最后一行表达式的结果
def calculate(x: Int): Int = {
  val double = x * 2
  double + 3  // 最后一行表达式的结果作为返回值
}

calculate(5)  // 结果:13(5*2=10,10+3=13)

2. 显式指定返回类型

函数定义时,建议可以显式返回值类型(在参数列表后用 : 类型 声明)。对于单行函数或编译器可推断类型的场景,返回类型可省略,但递归函数必须显式声明返回类型

// 显式声明返回类型(推荐,可读性更高)
def max(a: Int, b: Int): Int = if (a > b) a else b

// 省略返回类型(编译器自动推断)
def min(a: Int, b: Int) = if (a < b) a else b  // 正确,返回类型为 Int

// 递归函数必须显式声明返回类型
def factorial(n: Int): Int =  // 若省略 : Int 会报错
  if (n <= 1) 1 else n * factorial(n - 1)

3. 使用 return 关键字提前返回

通常不推荐使用 return(不符合函数式编程风格),但可在需要提前退出函数时使用。此时必须显式声明函数的返回类型(否则编译器报错)。

// 使用 return 提前返回
def checkPositive(x: Int): String = {
  if (x <= 0) return "Not positive"  // 提前返回
  "Positive"  // 若 x>0,返回此结果
}

checkPositive(-3)  // 结果:"Not positive"
checkPositive(5)   // 结果:"Positive"

注意:return 仅在方法(定义在类 / 对象中的函数)中有效,在匿名函数或纯函数中使用可能导致意外行为。

4. 无返回值(Unit 类型)

若函数没有实际返回值(仅执行副作用,如打印),返回类型为 Unit(类似 Java 的 void),可省略返回类型声明。

// 显式声明返回类型为 Unit
def printHello(): Unit = println("Hello")

// 省略返回类型(编译器推断为 Unit)
def log(message: String) = println(s"Log: $message")

printHello()  // 输出 "Hello",返回 Unit(可理解为无值)
log("test")   // 输出 "Log: test",返回 Unit

5. 多返回值的模拟

Scala 函数本身只能返回单一值,但可通过元组(Tuple)  或样例类(Case Class)  模拟 “多返回值”。

// 用元组返回多个值
def splitName(fullName: String): (String, String) = {
  val parts = fullName.split(" ")
  (parts(0), parts(1))  // 返回二元组 (名, 姓)
}

val (first, last) = splitName("Alice Smith")  // 解构元组
println(first)  // "Alice"
println(last)   // "Smith"

// 用样例类返回多值(更具可读性)
case class User(name: String, age: Int)
def createUser(): User = User("Bob", 25)

val user = createUser()
println(user.name)  // "Bob"
println(user.age)   // 25