Kotlin 中是否有类似的东西提供与 Swift 关键字“defer”相同的功能?
defer 关键字的作用是确保 defer block 中的代码在从函数返回之前得到执行。
下面是一个假设 defer 关键字存在于 Kotlin 中的例子。
class MyClass {
var timeStamp = 0L
fun isEdible(fruit: Fruit): Boolean {
defer {
timeStamp = System.currentTimeMillis()
}
if (fruit.isExpired) {
return false
}
if (fruit.isRipe) {
return true
}
return false
}
}
在上面的例子中,无论函数在什么时候返回,defer
中的 block 将被执行并且时间戳的值将在函数结束之前得到更新。
我知道 Java 有 finally {}
关键字与 try{} catch{}
一起使用,但这并不是 defer 提供的。
最佳答案
Kotlin 中没有这样的关键字,但您可以自己构建一个工作方式非常相似的结构。像这样(注意这不处理延迟 block 中的异常):
class Deferrable {
private val actions: MutableList<() -> Unit> = mutableListOf()
fun defer(f: () -> Unit) {
actions.add(f)
}
fun execute() {
actions.forEach { it() }
}
}
fun <T> defer(f: (Deferrable) -> T): T {
val deferrable = Deferrable()
try {
return f(deferrable)
} finally {
deferrable.execute()
}
}
然后你可以像这样使用它:
class MyClass {
var timeStamp = 0L
fun isEdible(fruit: Fruit): Boolean = defer { d ->
d.defer {
timeStamp = System.currentTimeMillis()
}
if (fruit.isExpired) {
return false
}
if (fruit.isRipe) {
return true
}
return false
}
}
关于android - Kotlin 相当于 Swift 的 defer 关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51411018/