参数相关

1)默认参数值

在声明形参时,可以指定默认值。在调用函数时,如果没有指定实参,使用默认值,否则实参会覆盖默认值

  1. def printMsg(name: String, age: Int = 22) = {
  2. println(s"name=$name, age=$age")
  3. }
  4. printMsg("zhangsan")
  5. // 结果:name=zhangsan, age=22

2)命名参数

✍ 思考:当函数存在多个形参,且每个形参都能设定默认值,那么传递的实参是覆盖了默认值,还是赋值给了没有默认值的参数呢?
这个时候就不确定了,因为传参的时候是按照从左到右的顺序依次赋值给形参的,所以该情况下可以使用命名参数

  1. def getMysqlConnection(ip: String, port: Int = 3306, user: String = "root", pwd: String) = {
  2. print(s"$ip:$port(user=$user, password=$pwd)")
  3. }
  4. getMysqlConnection(ip = "localhost", pwd = "123456")
  5. // 结果:localhost:3306(user=root, password=123456)

3)可变参数

可变参数会把传进来的多余数值收集起来封装成一个集合
注意:可变参数必须写在形参列表的最后

  1. /*
  2. args 是可变参数,它是一个集合,可以通过 for 循环遍历集合
  3. args 中收集的数值个数的范围是 0 ~ 多个
  4. */
  5. def sum(value: Int, args: Int*) {
  6. print(s"value=$value, args=[${args.mkString(",")}]")
  7. }
  8. sum(1, 2, 3)
  9. // 结果:value=1, args=[2,3]

4)其他规则

  • 形参列表可以为空,此时函数调用时可以不用带“()”
  • 形参默认是“val”的,因此不能在函数中进行修改

    嵌套规则

    Scala 语法中任何的语法结构都可以嵌套其他语法结构(灵活)
    函数中可以再声明/定义函数;类中可以再声明类;方法中可以再声明/定义方法

    可以通过反编译器查看 Java 代码

  1. object FunctionNested {
  2. def main(args: Array[String]): Unit = {
  3. // 反编译后内容:private final void say$1()
  4. def say(): Unit = {
  5. print("main say")
  6. // 反编译后内容:private final void say$2()
  7. def say(): Unit = {
  8. println("main say say")
  9. }
  10. }
  11. }
  12. // 反编译后内容:public void say()
  13. def say(): Unit = {
  14. print("haha")
  15. }
  16. }

返回值相关

  1. 函数可以根据函数体最后一行代码自行推断函数返回值类型,该情况下 return 关键字能省略
  2. 在情况1下,由于Scala 可以自行推断返回值类型,所以返回值类型也可以省略(“=”不能省略)
  3. 如果函数明确使用了 return 关键字,那么函数返回时就不能自行推断了,必须明确返回值类型
  4. 在情况3下,如果没有“: 返回值类型 =”,那么即使使用 return 语句,返回结果也谓空,即“()”
  5. 如果函数明确无返回值,那么即使使用 return 语句也不会有返回值
  6. 递归函数不能使用类型推断,所以未执行之前无法推断出返回值类型,必须明确返回值类型
    1. // 情况1
    2. def sum1(m: Int, n: Int): Int = {
    3. m + n
    4. }
    5. // 情况2
    6. def sum2(m: Int, n: Int) = {
    7. m + n
    8. }
    9. // 情况3
    10. def sum3(m: Int, n: Int): Int = {
    11. return m + n
    12. }
    13. // 情况4
    14. def sum4(m: Int, n: Int) {
    15. return m + n
    16. }
    17. // 情况5
    18. def sum4(m: Int, n: Int): Unit = {
    19. return m + n
    20. }
    21. // 情况6
    22. def sum5(m: Int): Int = {
    23. if (m == 1) {
    24. m
    25. } else {
    26. 2 * sum5(m - 1)
    27. }
    28. }

    函数简写

    1. def fun() = {
    2. "hello"
    3. }
    4. // 可以简写为
    5. def fun = "hello"

    过程

    返回类型为 Unit 的函数称为过程;如果明确函数没有返回值,那么“=”可以省略
    注意:如果一个函数没有明确返回值类型,但是有“=”号,那么它实际是有返回值的,所以该函数不是过程提示:类型推导
    1. def process(name: String): Unit = {
    2. println(s"$name, hello!")
    3. }