输出结果:
str = java
str = kotlin
用法2:
因为
run
函数执行了我传进去的lambda
表达式并返回了执行的结果,所以当一个业务逻辑都需要执行同一段代码而根据不同的条件去判断得到不同结果的时候。可以用到run
函数
例:都要获取字符串的长度。
val index = 3
val num = run {
when(index){
0 -> “kotlin”
1 -> “java”
2 -> “php”
3 -> “javaScript”
else -> “none”
}
}.length
println(“num = $num”)
输出结果为:
num = 10
3.2.2、T.run()
其实T.run()
函数和run()
函数差不多,关于这两者之间的差别我们看看其源码实现就明白了:
public inline fun <T, R> T.run(block: T.() -> R): R {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
return block()
}
从源码中我们可以看出,block()
这个函数参数是一个扩展在T
类型下的函数。这说明我的block()
函数可以可以使用当前对象的上下文。所以当我们传入的lambda
表达式想要使用当前对象的上下文的时候,我们可以使用这个函数。
例:
val str = “kotlin”
str.run {
println( “length = t h i s . l e n g t h " ) p r i n t l n ( " f i r s t = {this.length}" ) println( "first = this.length" )println( "first = {first()}”)
println( “last = ${last()}” )
}
输出结果为:
length = 6
first = k
last = n
在其中,可以使用this
关键字,因为在这里它就代码str
这个对象,也可以省略。因为在源码中我们就可以看出,block()
就是一个T
类型的扩展函数。
这在实际的开发当中我们可以这样用:
例: 为TextView
设置属性。
val mTvBtn = findViewById(R.id.text)
mTvBtn.run{
text = “kotlin”
textSize = 13f
…
}
3.3 、with()函数
其实with()
函数和T.run()
函数的作用是相同的,我们这里看下其实现源码:
public inline fun <T, R> with(receiver: T, block: T.() -> R): R {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
return receiver.block()
}
这两个函数的区别在于:
with
是正常的高阶函数,T.run()
是扩展的高阶函数。with
函数的返回值指定了receiver
为接收者。
例:实现上面的T.run()
函数的列子
val str = “kotlin”
with(str) {
println( “length =