Kotlin 为什么需要代码B在输入参数中使用SQLiteDatabase.()?
代码A很好,为了简单起见,有人编写代码B 我不明白为什么参数应该是代码B中的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()
(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我已经编辑了答案并添加了解释。