参数相关
1)默认参数值
在声明形参时,可以指定默认值。在调用函数时,如果没有指定实参,使用默认值,否则实参会覆盖默认值
def printMsg(name: String, age: Int = 22) = {
println(s"name=$name, age=$age")
}
printMsg("zhangsan")
// 结果:name=zhangsan, age=22
2)命名参数
✍ 思考:当函数存在多个形参,且每个形参都能设定默认值,那么传递的实参是覆盖了默认值,还是赋值给了没有默认值的参数呢?
这个时候就不确定了,因为传参的时候是按照从左到右的顺序依次赋值给形参的,所以该情况下可以使用命名参数
def getMysqlConnection(ip: String, port: Int = 3306, user: String = "root", pwd: String) = {
print(s"$ip:$port(user=$user, password=$pwd)")
}
getMysqlConnection(ip = "localhost", pwd = "123456")
// 结果:localhost:3306(user=root, password=123456)
3)可变参数
可变参数会把传进来的多余数值收集起来封装成一个集合
注意:可变参数必须写在形参列表的最后
/*
args 是可变参数,它是一个集合,可以通过 for 循环遍历集合
args 中收集的数值个数的范围是 0 ~ 多个
*/
def sum(value: Int, args: Int*) {
print(s"value=$value, args=[${args.mkString(",")}]")
}
sum(1, 2, 3)
// 结果:value=1, args=[2,3]
4)其他规则
- 形参列表可以为空,此时函数调用时可以不用带“()”
- 形参默认是“val”的,因此不能在函数中进行修改
嵌套规则
Scala 语法中任何的语法结构都可以嵌套其他语法结构(灵活)
函数中可以再声明/定义函数;类中可以再声明类;方法中可以再声明/定义方法可以通过反编译器查看 Java 代码
object FunctionNested {
def main(args: Array[String]): Unit = {
// 反编译后内容:private final void say$1()
def say(): Unit = {
print("main say")
// 反编译后内容:private final void say$2()
def say(): Unit = {
println("main say say")
}
}
}
// 反编译后内容:public void say()
def say(): Unit = {
print("haha")
}
}
返回值相关
- 函数可以根据函数体最后一行代码自行推断函数返回值类型,该情况下 return 关键字能省略
- 在情况1下,由于Scala 可以自行推断返回值类型,所以返回值类型也可以省略(“=”不能省略)
- 如果函数明确使用了 return 关键字,那么函数返回时就不能自行推断了,必须明确返回值类型
- 在情况3下,如果没有“: 返回值类型 =”,那么即使使用 return 语句,返回结果也谓空,即“()”
- 如果函数明确无返回值,那么即使使用 return 语句也不会有返回值
- 递归函数不能使用类型推断,所以未执行之前无法推断出返回值类型,必须明确返回值类型
// 情况1
def sum1(m: Int, n: Int): Int = {
m + n
}
// 情况2
def sum2(m: Int, n: Int) = {
m + n
}
// 情况3
def sum3(m: Int, n: Int): Int = {
return m + n
}
// 情况4
def sum4(m: Int, n: Int) {
return m + n
}
// 情况5
def sum4(m: Int, n: Int): Unit = {
return m + n
}
// 情况6
def sum5(m: Int): Int = {
if (m == 1) {
m
} else {
2 * sum5(m - 1)
}
}
函数简写
def fun() = {
"hello"
}
// 可以简写为
def fun = "hello"
过程
返回类型为 Unit 的函数称为过程;如果明确函数没有返回值,那么“=”可以省略
注意:如果一个函数没有明确返回值类型,但是有“=”号,那么它实际是有返回值的,所以该函数不是过程提示:类型推导def process(name: String): Unit = {
println(s"$name, hello!")
}