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

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

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

        block()

}

fun main() {

        nonLocalReturn {

                return

        }

}

禁止nonlocalreturn使用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成员

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

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

标准库中常用的扩展函数:letrunalso、alppyuse

从各自的函数上看

@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)
    }
}

原文地址:https://blog.csdn.net/Dragonlongbo/article/details/134388124

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_31546.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注