函数的调用

82 阅读2分钟

1. 基本调用(带参数)

最常规的调用方式,使用括号 () 传递参数,参数之间用逗号分隔。

// 定义一个函数
def add(a: Int, b: Int): Int = a + b

// 调用函数
val result = add(2, 3)  // 结果:5

2. 无参数函数调用

  • 若函数定义时不带参数,调用时可省略括号。
  • 若函数定义时显式写了空括号 (),调用时可带或不带括号。
// 定义无参数函数(不带括号)
def greet: String = "Hello"

// 调用(必须不带括号)
greet  // 结果:"Hello"
// greet()  // 错误!


// 定义无参数函数(带空括号)
def welcome(): String = "Welcome"

// 调用(可带或不带括号)
welcome()  // 结果:"Welcome"
welcome    // 结果:"Welcome"

3. 中缀调用(针对单参数函数)

对于仅含一个参数的函数,可以省略点 . 和括号,直接用空格分隔函数名和参数(类似运算符)。

// 定义单参数函数
def multiplyByTwo(x: Int): Int = x * 2

// 常规调用
multiplyByTwo(5)  // 结果:10

// 中缀调用(省略点和括号)
5 multiplyByTwo  // 错误!注意:中缀调用时函数名在中间
// 正确写法:函数名在两个操作数之间
5 multiplyByTwo  // 错误!函数名需放在参数前,应为:
multiplyByTwo 5  // 结果:10(等价于 multiplyByTwo(5))

// 更典型的例子:Scala 内置的运算符本质是函数
1 + 2  // 等价于 1.+(2)

4. 后缀调用(无参数函数)

无参数函数可在对象后直接调用,省略点和括号(类似后缀运算符)。

def log(): Unit = println("Logging...")

// 后缀调用
log  // 等价于 log(),输出:Logging...

5. 命名参数调用

传递参数时可显式指定参数名,避免参数顺序错误,尤其适合参数多的函数。

def personInfo(name: String, age: Int, city: String): String = 
  s"$name, $age, from $city"

// 按顺序传参
personInfo("Alice", 30, "Beijing")  // 结果:"Alice, 30, from Beijing"

// 命名参数(可打乱顺序)
personInfo(age = 25, name = "Bob", city = "Shanghai")  // 结果:"Bob, 25, from Shanghai"

6. 默认参数调用

函数定义时可指定参数默认值,调用时可省略这些参数。

def greet(name: String = "Guest"): String = s"Hello, $name!"

// 调用时省略默认参数
greet()  // 结果:"Hello, Guest!"

// 覆盖默认参数
greet("Tom")  // 结果:"Hello, Tom!"

7. 可变参数调用

通过 * 定义可变参数(类似数组),调用时可传递多个参数或数组(需加 :_* 转换)。

// 定义可变参数函数
def sum(nums: Int*): Int = nums.sum

// 传递多个参数
sum(1, 2, 3)  // 结果:6

// 传递数组(需用 :_* 转换)
val arr = Array(4, 5, 6)
sum(arr: _*)  // 结果:15

8. 高阶函数调用(函数作为参数)

Scala 支持函数作为参数传递,调用时直接传入函数名或匿名函数。

// 高阶函数:接收一个函数作为参数
def applyFunc(f: Int => Int, x: Int): Int = f(x)

// 定义一个函数
def square(x: Int): Int = x * x

// 传递函数名
applyFunc(square, 3)  // 结果:9

// 传递匿名函数
applyFunc(x => x + 1, 5)  // 结果:6

总结

Scala 函数调用的灵活性体现在:

  • 可省略括号(无参数或单参数场景)。
  • 支持命名参数和默认参数,提高可读性。
  • 中缀 / 后缀调用使代码更简洁(类似自然语言)。
  • 原生支持高阶函数调用,适合函数式编程。