есть ли у котлина поддержка параметров по имени? - PullRequest
0 голосов
/ 30 сентября 2019

Scala имеет поддержку параметров по имени, и его использование выглядит следующим образом, возможно ли добиться этого в kotlin?

  def invoke(block: => Boolean) = block

  // usage
  var exposure = 0
  invoke(exposure == 1)

У меня есть следующий метод в kotlin:

fun waitFor(condition: () -> Boolean) = condition()

// usage
var exposure = 0
waitFor { exposure == 1 }

waitFor(exposure == 1) // I want its usage to look like this, but it does not compile

waitFor является частью нашего пользовательского DSL, который принимает блок, и он должен оценивать его при каждом вызове.

1 Ответ

0 голосов
/ 30 сентября 2019

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)

Это может быть полезно в простых случаях, но не в тех случаях, когда вы хотите, чтобы весь блок вызывался по имени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...