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 函数调用的灵活性体现在:
- 可省略括号(无参数或单参数场景)。
- 支持命名参数和默认参数,提高可读性。
- 中缀 / 后缀调用使代码更简洁(类似自然语言)。
- 原生支持高阶函数调用,适合函数式编程。