38. 闭包

闭包就是函数的运行环境是一个封闭的环境。在环境中有自由变量。也可以理解为函数中的函数。kotlin 中可以把函数当作参数和返回值来用。
先写一个累加

fun makeFun():()->Unit{
    var count = 0
    return fun(){
        println(++count)
    }
}

可以看到,返回值是一个匿名函数。匿名函数实现的是 makeFun() 函数内变量的累加。

    val x = makeFun()
    x()
    x()
    x()
    x()

这样调用就可以了。
因为闭包是内存中始终保存着变量,所以每次运行都在原有基础上进行操作。不会因为函数运行结束就清除内存变量。
再看一个斐波那契数列的例子。

fun fibonacci():()->Int{
    var first = 0
    var second = 1
    return fun():Int{
        var result = second
        second += first
        first = second - first
        return result
    }
}

fun fibonacci2():()->Int{
    var first = 0
    var second = 1
    return fun():Int{
        var result = first + second
        first = second
        second = result
        return first
    }
}

这两个函数没有什么本质的区别。理解了就好。
调用如下

    val x = fibonacci2()
    println(x())
    println(x())
    println(x())
    println(x())
    println(x())

看一个迭代器的例子,还是以斐波那契数列来写。

fun fibonacci3(): Iterable<Int> {
    var first = 0
    var second = 1
    return Iterable {
        object : IntIterator() {
            override fun nextInt(): Int {
                val result = first + second
                first = second
                second = result
                return first
            }

            override fun hasNext() = true
        }
    }
}

调用的时候,需要控制取值范围。

    for (i in fibonacci3()) {
        if (i > 100) break
        println(i)
    }
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1 概述 1.1函数的声明 JavaScript 有三种声明函数的方法。 (1)function 命令 funct...
    徵羽kid阅读 3,047评论 0 1
  • 函数是一段可以反复调用的代码块。函数还能接受输入的参数,不同的参数会返回不同的值。 概述 函数的声明 JavaSc...
    许先生__阅读 3,251评论 0 1
  • 参考文章:函数 1.概述 1.1函数的声明 JavaScript 有三种声明函数的方法。 (1)function ...
    chrisghb阅读 5,086评论 0 0
  • 早饭没吃饱,赶上领导在训斥另外一个同事,同事很委屈回到工位心情很糟糕,我又很饿结果特别容易被她的情绪影响,整个人特...
    AI成长家阅读 775评论 0 0
  • 我为什么要寻找他呢?我不就是他吗?他的本质透过我而显现。我寻找的,只是我自己!- 诗人鲁米 了解一个人,如果只是去...
    黑白大熊猫阅读 3,452评论 1 0

友情链接更多精彩内容