每天学一点 Kotlin -- 函数:作用范围

2021-10-24  本文已影响0人  冯可乐同学

----《第一季Kotlin崛起:次世代Android开发 》学习笔记

总目录:每天学一点 Kotlin ---- 目录
上一篇:每天学一点 Kotlin -- 函数:初次见面
下一篇:每天学一点 Kotlin -- 函数:参数

1. 函数的作用范围

1.1 函数根据作用范围可分为:成员函数、本地函数、顶层函数

2. 成员函数

2.1 定义在一个类、object 或者接口内的函数称为成员函数,也称为方法。作用和 Java 中是一样的。

3. 本地函数

3.1 在 Kotlin 中,可以允许把小函数声明在其他函数内部,它们被称为本地函数或嵌套函数。甚至可以多层嵌套。举个栗子:

fun printArea(w: Int, h: Int){
    fun area(w: Int, h: Int): Int{
        return w * h
    }
    
    val result = area(w, h)
    println("area = " + result)
}

4.在上面的代码中,函数 area() 就是本地函数。area() 函数在 printAre() 外部就无效了,它只服务于 printArea()。这在实现一个大函数时隐藏实现的细节是非常有用的。使用 Kotlin 中的私有(private)声明也可以实现这样的效果。那么本地函数跟 private 函数有什么好处呢?必须有!那就是可以访问嵌套主函数中的变量。比如,上面的代码可以简化为:

fun printArea(w: Int, h: Int){
    fun area() = w * h
    
    val result = area()
    
    println("area = " + result)
}
  1. 再来看一个使用本地函数的例子:
fun checkNum(start: Int, end: Int) {
    for (num in start..end) {
        if (num % 3 == 0) {
            println("被3整除")
        } else if (num % 5 == 0) {
            println("被5整除")
        } else if (num % 3 == 0 && num % 5 == 0) {
            println("能被3和5整除")
        } else {
            println(num)
        }
    }
}

checkNum() 函数这是一个普通的检查在一个区间内能被3或5整除的函数,被3整除的代码重复写了两次,这就意味着双倍 bug 的可能性,优化如下:

fun checkNum1(start: Int, end: Int) {
    fun isThree(x: Int) = (x % 3 == 0)
    fun isFive(x: Int) = (x % 5 == 0)

    for (num in start..end) {
        if (isThree(num)) {
            println("被3整除")
        } else if (isFive(num)) {
            println("被5整除")
        } else if (isThree(num) && isFive(num)) {
            println("能被3和5整除")
        } else {
            println(num)
        }
    }
}

checkNum1() 中声明了两个本地函数,重构了函数,消除重复。

fun checkNum2(start: Int, end: Int) {
    for (k in start..end) {
        fun isThree() = (k % 3 == 0)
        fun isFive() = (k % 3 == 0)

        if (isThree()) {
            println("被3整除")
        } else if (isFive()) {
            println("被5整除")
        } else if (isThree() && isFive()) {
            println("能被3和5整除")
        } else {
            println(k)
        }
    }
}

checkNum2() 中把本地函数放到了更小的范围中,这样的话就消除了 checkNum1() 中传递多次参数的情况

fun checkNum3(start: Int, end: Int) {
    for (i in start..end) {
        fun isThree() = (i % 3 == 0)
        fun isFive() = (i % 5 == 0)

        when {
            isThree() -> println("被3整除")
            isFive() -> println("被5整除")
            isThree() && isFive() -> println("能被3和5整除")
            else -> println(i)
        }
    }
}

checkNum3() 中使用了 when,比 checkNum2() 中多个 if-else 的判断语句更加简洁了。以上就是本地函数的好处

4. 顶层函数

4.1 除了成员函数和本地函数外,Kotlin 还支持声明顶层函数。所谓顶层,即这些函数不属于任何源码文件中的小集团(class, 对象,interface),而是直接定义在 Kotlin 文件中的,在 xx.kt 文件中。 ---- 这一点跟 Swift 中是一样的,属于文件而不属于 class 或 interface。

4.2 在定义通用性的工具栏和帮助类类的函数时非常有用。

相关代码:https://gitee.com/fzq.com/test-demo
上一篇下一篇

猜你喜欢

热点阅读