Зачем нужен код B для использования SQLiteDatabase. () В параметре ввода?

Код А хорош, чтобы сделать это просто, кто-то написал код Б.

Я не могу понять, почему параметр shoud (transactionFun:SQLiteDatabase.()->Unit) в коде B

Я думаю (transactionFun: ()->Unit) в коде B тоже хороша, правильно?

Код А

 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 вы должны объявить переменную и отправить ее на лямбда. Код B лучше, потому что у вас есть доступ к dbHelper без переменной, потому что это функция расширения. Я думаю, что это выглядит лучше. Например, код вызова A выглядит

 fun callCodeA() { excuteTransaction { dbHelper.execSQL("sone query") } } 

код вызова B выглядит так:

 fun callCodeB() { dbHelper.executeTransaction { execSQL("sone query") } } 

Что касается SQLiteDatabase.() -> Unit . Он должен избегать переменных и получать доступ к this . Внутри лямбда у вас нет доступа к экземпляру текущего объекта. Самый простой способ добиться этого – отправить текущий объект на лямбда. Например, вы можете сделать

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

но с помощью функций расширения с лямбдами это выглядит лучше.

  • Kotlin повторяемые @annotations не работают на jdk-8
  • filterNotNull в списке Kotlin с общим типом
  • сигнал 7 (SIGBUS), код 2 (BUS_ADRERR)
  • Ошибка установки Kotlin / Native: файл jni.h не найден
  • IntelliJ Idea при тестировании сразу нескольких модулей включаются только артефакты из одного модуля
  • В чем разница между использованием @Annotation и в Kotlin?
  • Ошибка с java8 и Kotlin
  • Kotlin: Как получить и установить текст в TextView на Android с помощью Kotlin?
  • Вопрос о намерениях в приложении для Android от java до kotlin
  • В Котлине, как проверить, содержит то или иное значение?
  • Получить идентификатор ресурса android из строки
  • Давайте будем гением компьютера.