38. 闭包

作者: 厚土火焱 | 来源:发表于2017-11-28 11:06 被阅读31次

    闭包就是函数的运行环境是一个封闭的环境。在环境中有自由变量。也可以理解为函数中的函数。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)
        }
    

    相关文章

      网友评论

        本文标题:38. 闭包

        本文链接:https://www.haomeiwen.com/subject/krjjbxtx.html