原创

Kotlin捕获上下文中的变量和常量

Lambda表达式或匿名函数可以访问或修改其所在上下文中的变量和常量,这个过程被称为捕获

fun main(args: Array<String>) {
    //定义一个函数,该函数的返回值类型为()->List<String>
    fun makeList(ele: String): () -> List<String> {
        //创建一个不包含任何元素的List
        var list: MutableList<String> = mutableListOf()
        fun addElement(): List<String> {
            //向list集合中添加一个元素
            list.add(ele)
            return list
        }
        return ::addElement
    }
}

上例中顶一个一个局部函数,这个局部函数可访问或修改其所在函数中的变量。

Lambda表达式或匿名函数都会持有一个其所捕获的变量的副本,因此表面上看addElement()访问的是makeList()函数的list集合变量,但只要程序返回一个新的addElement()函数,addElement()函数就会持有一个新的list的副本。

Lambda表达式或匿名函数都会持有一个其所捕获的变量的副本,因此表面上看addElement()访问的是makeList()函数的list集合变量,只要程序返回一个新的addElement()函数,就会持有一个新的list的副本。

fun main(args: Array<String>) {
    println("******add1返回的List**********")
    val add1 = makeList("刘备")
    println(add1())
    println(add1())

    println("******add2返回的List**********")
    val add2 = makeList("关羽")
    println(add2())
    println(add2())
}

输出结果:

******add1返回的List**********
[刘备]
[刘备, 刘备]
******add2返回的List**********
[关羽]
[关羽, 关羽]

学海无涯苦作舟

我的微信公众号.jpg

基本语法
  • 作者:HunterArley (联系作者)
  • 发表时间:2019-11-21 10:47
  • 版权声明:本网站部分内容转载于合作站点或其他站点,但都会注明作/译者和原出处。如有不妥之处,敬请指出。
  • 公众号转载:请在文末添加作者公众号二维码