@kotlin.internal.InlineOnly
public inline fun <T, R> T.run(block: T.() -> R): R {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
return block()
}
调用run函数的对象类型是泛型,说明任何对象都可以调用该方法。
run 函数是将一个对象作为 lambda 表达式的接收者,在 lambda 表达式内部可以通过 this 或省略掉 this 直接访问对象的方法和属性。与let函数一样,它的返回值是 lambda 表达式的执行结果。
使用场景:package str
fun main(){
var name = "Stephen"
println(name)
// 匿名函数
var r1 = name.run {
if(this == "hello") false else true
}
println("r1--$r1")
val f1 : (e:String)->String = {
e->e ":success"
}
var r2 = name.run(f1)
println("r2--$r2")
// 具名函数
var r3 = name.run(::isEqual)
println("r3--$r3")
}
fun isEqual(src:String):Boolean{
println("in method equal:$src")
return false;
}
//输出
Stephen
r1--true
r2--Stephen:success
in method equal:Stephen
r3--false
令我不理解的是,具名函数isEqual作为run的参数传递后,isEqual函数的参数src值为什么会是run函数的调用者name。
并且这种用法只适用于isEqual函数只有1个参数,如果有2个参数就报错。这是有什么特殊的约定吗?
有没有大神指点一下?