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