udalov
04/26/2017, 12:01 PMfun KProperty0<*>.isInitialized() = (this.apply { isAccessible = true }.getDelegate() as MyDelegate).isInitialized()
electrolobzik
04/26/2017, 12:04 PM.apply { isAccessible = true }
?udalov
04/26/2017, 12:08 PMв чем необходимостьэто нужно, потому что вообще говоря, делегат это деталь реализации свойства, так же как и private backing field деталь реализации неделегированного свойства?.apply { isAccessible = true }
isAccessible = true
я могу как-то ограничить применимость этой экстеншн функции только к определенному типу делегатов?вроде нет, потому что в типе ссылки на свойство не закодировано ничего про тип её делегата (опять же, потому что это деталь реализации, может поменяться при перекомпиляции и т.д.)
electrolobzik
04/26/2017, 12:11 PMelizarov
04/26/2017, 12:22 PMelectrolobzik
04/26/2017, 12:24 PMelizarov
04/26/2017, 12:30 PMelectrolobzik
04/26/2017, 12:32 PMprivate var mCameraParameters: Camera.Parameters by disposablePropertyManager.disposable()
override fun setFlash(flashMode: FlashMode) {
if (this::mCameraParameters.hasValue()) {
val flashes = mCameraParameters.supportedFlashModes
val internalFlash = flashMode.cameraConstant
if (flashes != null && flashes.contains(internalFlash)) {
mCameraParameters.flashMode = internalFlash
this.flashMode = flashMode
} else {
val currentFlash = this.flashMode.cameraConstant
if (flashes == null || !flashes.contains(currentFlash)) {
mCameraParameters.flashMode = Camera.Parameters.FLASH_MODE_OFF
this.flashMode = FlashMode.Off
}
}
mCamera.parameters = mCameraParameters
} else {
this.flashMode = flashMode
}
}
elizarov
04/26/2017, 12:34 PMelectrolobzik
04/26/2017, 12:34 PMelizarov
04/26/2017, 12:35 PMprivate var mCameraParameters: Camera.Parameters?
, то оно будет отлично работать и Котлин не даст вам случайно NPE получить, забыв что оно nullablemCameraParams?. let { … }
отлично работает чтобы сделать что-то если оно установленоelectrolobzik
04/26/2017, 12:37 PMmCameraParams?.let {} ?: {}
выглядит не так наглядно как if (params != null) {} else {}
elizarov
04/26/2017, 12:39 PMelectrolobzik
04/26/2017, 12:40 PMelizarov
04/26/2017, 12:40 PMelectrolobzik
04/26/2017, 12:41 PMval params = this.params
и использовать класический наглядный if-elseelizarov
04/26/2017, 12:41 PM?.let { ... }
не будет вам казаться непонятнымelectrolobzik
04/26/2017, 12:41 PM?:
? я получаю ошибку что ожидается Unit
, а не () -> Unit
elizarov
04/26/2017, 8:51 PMrun { ... }
если нужен блокelectrolobzik
04/26/2017, 9:45 PM} ?: run {
выглядит имхо сильно менее читабельно и очевидно чем } else {
.if (let localA = a, let localB = b) {} else {}
?elizarov
04/27/2017, 8:23 AMelectrolobzik
04/27/2017, 2:07 PMelizarov
04/27/2017, 2:13 PMmiha-x64
04/27/2017, 2:21 PMval x = x
val y = y
if (x != null && y != null) {
вроде тоже противоречит DRY. 🙃electrolobzik
04/27/2017, 2:30 PMmiha-x64
04/27/2017, 2:37 PMif (val x != null && val y != null) {
кажется мне категорически нелогичной.
1) Ускоренное вычисление. Если x == null, то y проверяться не будет… Но локальная переменная должна быть присвоена?
2) Должны ли быть эти переменные видны в последующих else if … else? Если да, то почему? Если нет, то почему?
Иногда мне кажется более логичным делать какую-то пометку, чтобы свойство автоматически однократно считавалось и на чтение вело себя как локальная переменная. Но там возникнет не меньше вопросов…electrolobzik
04/27/2017, 2:38 PMmiha-x64
04/27/2017, 2:41 PMit also keep ability to access source property in any way (read/write)Если let ведёт себя как val, то записывать как раз никто не позволит, только читать.
electrolobzik
04/27/2017, 2:41 PMmiha-x64
04/27/2017, 2:42 PMelizarov
04/27/2017, 2:57 PMelectrolobzik
04/27/2017, 3:02 PMelizarov
04/27/2017, 3:03 PMvariable?.let { doSomethingWithIt }
возникают время от времени, а чтобы несколько — нетelectrolobzik
04/27/2017, 3:22 PM