Intereting Posts
С плагином «kotlin-kapt», Android Studio не дает конкретных ошибок в отношении Dagger 2 Почему в контексте нет основного атрибута цвета активности? Котлин, общая операция по числу Java.lang.ClassNotFoundException: Не нашел класс Kotlin Android Plugin 2.2.0-alpha1 не скомпилируется с Kotlin Почему я не могу добавить два номера в Котлин, используя этот исходный код? Фильтр списка в пределах диапазона – KOTLIN Language Change Locale в программировании «Kotlin». Поскольку язык работает в Java Fine, но на языке Kotlin не работает Android N Java 8 (компилятор Jack) и Kotlin interop Создайте общий наблюдаемый, который избегает множественного вызова Android – Tab # 3 очищает представление списка из Tab # 1. Как установить делегированное значение свойства путем отражения в котлин? Использовать группу в ConstraintLayout для прослушивания событий кликов на нескольких представлениях Что означает предупреждение «Использовать свойства из пакетов вариантов сборки»? Попытка исключить поле при сохранении класса данных kotlin в качестве документа в Google Cloud Firestore

Зачем нужен код 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() } } 

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