参数相关
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 语句也不会有返回值
- 递归函数不能使用类型推断,所以未执行之前无法推断出返回值类型,必须明确返回值类型
// 情况1def sum1(m: Int, n: Int): Int = {m + n}// 情况2def sum2(m: Int, n: Int) = {m + n}// 情况3def sum3(m: Int, n: Int): Int = {return m + n}// 情况4def sum4(m: Int, n: Int) {return m + n}// 情况5def sum4(m: Int, n: Int): Unit = {return m + n}// 情况6def 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!")}
