Kotlin не поддерживает вызов по имени, но вы можете эмулировать эту функцию (с ограничениями), используя делегированные свойства, и они также могут использоваться локально.
Сначала рассмотрите ленивое значение Kotlin. Ленивый Kotlin реализуется через делегированные свойства. Ленивое значение оценивается при первом обращении к нему и может использоваться как вызов по имени в случае, если вам нужно выполнить оценку только один раз.
val exposure by lazy { 0 }
waitFor(exposure == 1)
Вы можете реализовать пользовательское делегированное свойство, которое даст вам почти семантикувызова по имени
fun <T> callByName(block: () -> T) = object: ReadOnlyProperty<Any?, T> {
override fun getValue(thisRef: Any?, property: KProperty<*>) = block()
}
Переменная или свойство, определенное таким образом, будет оценивать использование предоставленного блока при каждом доступе, вроде как лениво. Это не то же самое, что и по имени, поскольку переменная все еще вычисляет, когда вычисляет блок, в котором находится ее область, что здесь происходит до вызова метода waitFor
.
val exposure by callByName { UUID.randomUUID() }
val alwaysFalse = exposure == exposure
waitFor(exposure == 1)
Это может быть полезно в простых случаях, но не в тех случаях, когда вы хотите, чтобы весь блок вызывался по имени.