Kotlin学习之03

nonLocalReturn返回调用的方法,下面直接返回main方法

inline fun nonLocalReturn(block:() -> Unit) {

        block()

}

fun main() {

        nonLocalReturn {

                return

        }

}

禁止non-local-return,使用crossinline关键字

public inline fun IntArray.forEach(crossinline action: (Int) -> Unit): Unit {

        for(element in this) action(element)

}

使用该关键字后,将无法在该函数内使用return

内联属性

var pocket: Double = 0.0

var money: Double 

      inline get() = pocket

      inline set(value) {
         pocket = value

      }  

内联函数限制:

  内联函数只能访问对应类的public成员

  内联函数的参数不能被存储(赋值给变量)

  内联函数的参数只能传递给其他内联函数

标准库中常用的扩展函数:let、run、also、alppy、use

从各自的函数上看

@kotlin.internal.InlineOnly
public inline fun <T, R> T.let(block: (T) -> R): R {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    return block(this)
}

let将T对象(即引用let的对象)作为函数的参数,那么在扩展函数内部,就可以用it替代T对象进行方法调用,而且let函数本身会对对象进行非空判断,返回值是函数返回值

@kotlin.internal.InlineOnly
@SinceKotlin("1.1")
public inline fun <T> T.also(block: (T) -> Unit): T {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    block(this)
    return this
}

also将T对象(即引用also的对象)作为函数的参数,那么在扩展函数内部,就可以用it替代T对象进行方法调用,而且let函数本身会对对象进行非空判断,返回值是对象本身

@kotlin.internal.InlineOnly
public inline fun <T, R> T.run(block: T.() -> R): R {
    contract {`
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    return block()
}

将函数作为T对象(即引用run的对象)的扩展函数,则在函数内部可用this引用T对象,并使用T对象的方法,返回值是函数本身

@kotlin.internal.InlineOnly
public inline fun <T> T.apply(block: T.() -> Unit): T {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    block()
    return this
}

将函数作为T对象(即引用apply的对象)的扩展函数,则在函数内部可用this引用T对象,并使用T对象的方法,返回值是对象本身

with

public inline fun <T, R> with(receiver: T, block: T.() -> R): R {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    return receiver.block()
}

将函数作为对象的扩展函数,返回函数本身

takeIf

public inline fun <T> T.takeIf(predicate: (T) -> Boolean): T? {
    contract {
        callsInPlace(predicate, InvocationKind.EXACTLY_ONCE)
    }
    return if (predicate(this)) this else null
}

takeUnless

public inline fun <T> T.takeUnless(predicate: (T) -> Boolean): T? {
    contract {
        callsInPlace(predicate, InvocationKind.EXACTLY_ONCE)
    }
    return if (!predicate(this)) this else null
}

repeat

public inline fun repeat(times: Int, action: (Int) -> Unit) {
    contract { callsInPlace(action) }

    for (index in 0 until times) {
        action(index)
    }
}

相关推荐

  1. Kotlin学习03

    2023-12-07 12:08:04       33 阅读
  2. Kotlin学习05

    2023-12-07 12:08:04       31 阅读
  3. Kotlin协程学习-02

    2023-12-07 12:08:04       30 阅读
  4. 入门Kotlin学习路经验总结

    2023-12-07 12:08:04       15 阅读
  5. CSS学习-02

    2023-12-07 12:08:04       39 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-07 12:08:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-07 12:08:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-07 12:08:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-07 12:08:04       20 阅读

热门阅读

  1. Kotlin(十四) 扩展函数和运算符重载

    2023-12-07 12:08:04       43 阅读
  2. activeMq

    activeMq

    2023-12-07 12:08:04      36 阅读
  3. C/C++---------------LeetCode第2154. 将找到的值乘以 2

    2023-12-07 12:08:04       42 阅读
  4. Scala--2

    2023-12-07 12:08:04       39 阅读
  5. 产品运营常用的ChatGPT通用提示词模板

    2023-12-07 12:08:04       48 阅读
  6. React 表单组件实现

    2023-12-07 12:08:04       40 阅读
  7. 五花八门客户问题(BUG) - 数据库索引损坏

    2023-12-07 12:08:04       46 阅读
  8. Metasploit的安全防御和逃逸

    2023-12-07 12:08:04       25 阅读
  9. SELinux refpolicy详解(9)

    2023-12-07 12:08:04       55 阅读
  10. Metasploit的漏洞挖掘和利用

    2023-12-07 12:08:04       26 阅读
  11. 详解ES6中的symbol

    2023-12-07 12:08:04       31 阅读