Kotlin 为什么需要代码B在输入参数中使用SQLiteDatabase.()?

Kotlin 为什么需要代码B在输入参数中使用SQLiteDatabase.()?,kotlin,Kotlin,代码A很好,为了简单起见,有人编写代码B 我不明白为什么参数应该是代码B中的(transactionFun:SQLiteDatabase.(->单位) 我认为代码B中的(transactionFun:()->Unit)也不错,对吧 代码A fun excuteTransaction(transactionFun:()->Unit){ val db = dbHelper.writableDatabase try{ db.beginTransaction()

代码A很好,为了简单起见,有人编写代码B

我不明白为什么参数应该是代码B中的
(transactionFun:SQLiteDatabase.(->单位)

我认为代码B中的
(transactionFun:()->Unit)
也不错,对吧

代码A

fun excuteTransaction(transactionFun:()->Unit){
    val db = dbHelper.writableDatabase
    try{
        db.beginTransaction()
        transactionFun()
        db.setTransactionSuccessful()
    }finally {
        db.endTransaction()
    }
}
代码B

fun SQLiteDatabase.executeTransaction(transactionFun:SQLiteDatabase.()->Unit){
    try{
        beginTransaction()
        transactionFun()
        setTransactionSuccessful()
    }finally {
        endTransaction()
    }
}

代码A很好,但是要访问dbHelper您应该声明一个变量并将其发送到lambda。 代码B更好,因为您可以在不使用变量的情况下访问dbHelper,因为它是扩展函数。我觉得它看起来好多了。 例如,调用代码A

fun callCodeA() {
    excuteTransaction {
        dbHelper.execSQL("sone query")
    }
}
调用代码B

fun callCodeB() {
    dbHelper.executeTransaction {
        execSQL("sone query")
    }
}
关于
SQLiteDatabase.(->Unit
。它需要避免变量并访问
。在lambda中,您无权访问当前对象实例。实现这一点的最简单方法是将当前对象发送到lambda。例如,你可以

fun SQLiteDatabase.executeTransaction(transactionFun: (SQLiteDatabase) -> Unit){
    try{
        beginTransaction()
        transactionFun(this)
        setTransactionSuccessful()
    }finally {
        endTransaction()
    }
}

但是通过使用lambdas的扩展功能,它看起来更好。

谢谢!但是SQLiteDatabase()是什么意思?@HelloCW我已经编辑了答案并添加了解释。