Kotlin 相当于 Swift 的 defer 关键字

rgv*_*rgv 9 android keyword kotlin swift

Kotlin 中是否有类似的东西可以提供与 Swift 关键字“defer”相同的功能?

defer 关键字的作用是确保 defer 块内的代码在从函数返回之前得到执行。

下面是一个假设 Kotlin 中存在 defer 关键字的示例。

    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
        }
     }
Run Code Online (Sandbox Code Playgroud)

在上面的情况下,无论函数在什么时候返回,内部的块都defer将被执行,并且时间戳的值将在函数结束之前更新。

我知道 Java 有finally {}与 一起使用的关键字try{} catch{},但它并不完全是 defer 提供的。

mar*_*ran 7

Kotlin 中没有这样的关键字,但您可以自己创建一个工作原理非常相似的构造。像这样的东西(请注意,这不处理延迟块中的异常):

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()
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样使用它:

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
    }
}
Run Code Online (Sandbox Code Playgroud)