La function de extensión de kotlin no entiende cómo funciona esto

Soy muy nuevo en el aprendizaje de Kotlin. Como todo era bastante comprensible, hoy me he topado con un código que me intimida. He buscado mucho e investigado un poco sobre este código. aquí está esta dos function de extensión que necesito entender

private fun T ?.useOrDefault(default: R, usage: T.(R) -> R) = this?.usage(default) ?:default 

segundo

 inline fun <F, S> doubleWith(first: F, second: S, runWith: F.(S) -> Unit) { first.runWith(second) } 

uso

 a.useOrDefault(100) { getInteger(R.styleable.ArcSeekBar_maxProgress, it) } set(progress) { field = bound(0, progress, Int.MAX_VALUE) drawData?.let { drawData = it.copy(maxProgress = progress) } invalidate() } 

Tengo una comprensión básica sobre lambdas y funciones de order superior, pero esta versión genérica de la function está realmente fuera de mi scope como principiante

Gracias y apreciaciones por adelantado

Lo principal de estas dos funciones es que son funciones de extensión de acuerdo con el documento oficial

Para declarar una function de extensión, debemos agregar su nombre al prefijo, es decir, el tipo que se está ampliando. Lo siguiente agrega una function de intercambio a MutableList<Int>

 fun MutableList<Int>.swap(index1: Int, index2: Int) { val tmp = this[index1] // 'this' corresponds to the list this[index1] = this[index2] this[index2] = tmp } 

La palabra key this dentro de una function de extensión corresponde al object receptor (el que se pasa antes del punto). Ahora, podemos llamar a dicha function en cualquier MutableList<Int>

Ahora si lo desea, puede cambiar el tipo Int a genérico como este

 fun <T> MutableList<T>.swap(index1: Int, index2: Int) { val tmp = this[index1] // 'this' corresponds to the list this[index1] = this[index2] this[index2] = tmp } 

Ahora mira la function useOrDefault está tomando el object que llama ("a" en el ejemplo), y si no es nulo, ejecuta la function "uso", de lo contrario, devuelve el valor pnetworkingeterminado. Como el uso actúa como una function de extensión de la persona que llama, es por eso que puede hacer "this? .usage ()"

lee este artículo, esto será muy útil para entender esta function

Funciones Ninja en Kotlin

doubleWith () conveniente para usar con object como primer parámetro, expresión compleja como segundo parámetro y lambda como tercero, por ejemplo

 doubleWith(first = a, second = {complex expression}) { // first as this (like in with body) // and second as it (or explicit parameter name) // in lambda body ... } 
  • ¿Cómo declaro un parámetro de function para aceptar funciones que arrojan?
  • Funciones de mayor order de Kotlin en el proyecto de Java
  • Poniendo un lambda genérico en un map
  • Kotlin: lambdas seguros (sin pérdida de memory)?
  • Tipo de function de Kotlin en su lugar interfaz funcional lambda
  • Kotlin: lambda nunca comstack
  • ¿Cómo crear una instancia de interfaz anónima en Kotlin?
  • Kotlin: comparar los valores de propiedad de diferentes objects objective con (fuera) reflexión
  • Enlace de datos: el campo Observable con valor lambda no comstack
  • Expresiones de kotlin lambda como parámetro opcional
  • Java Lambda para Kotlin