¿Es posible express kotlin 'con' método equivalente en Scala?

Kotlin Standard lib contiene el método 'con' que recibe un object y un método de ese object definido como:

public inline fun <T, R> with(receiver: T, block: T.() -> R): R = receiver.block() 

Y puede usarse como:

 val str = "string" with(str) { println(size)) // will print 6; equals to "string".size println(substring(3)) // will print (ing); equals to "string".substring(3) } 

¿Cómo definir un método similar en Scala?

No hay forma de definir dicho método en Scala, porque el concepto de literales de function con receptor no existe en Scala.

Sin embargo, la import de Scala es lo suficientemente general como para que pueda usarlo en lugar de with . Tu ejemplo escribiría como:

 val str = "string" import str._ println(length) println(substring(3)) 

Tenga en count que el size específicamente no funciona con este esquema porque sucede que es implícitamente creado en String , así que tuve que usar la length lugar. Sin embargo, en general, este es el patrón que usamos.

Editar después de comentar: si desea ubicar explícitamente la import en una parte de su código, puede hacerlo con llaves, que siempre están permitidas en el scope:

 val str = "string" { import str._ println(length) println(substring(3)) } println(length) // does not compile 

Tenga en count que la línea en blanco es necesaria, de lo contrario se analizará como intentar llamar al método apply en "string" con el {...} como argumento. Para evitar este problema, puede usar el método locally :

 val str = "string" locally { import str._ println(length) println(substring(3)) } println(length) // does not compile 

locally per se no hace nada; solo se usa para resaltar visualmente que las llaves están ahí solo por razones de scope y, por extensión, para ayudar a que el análisis haga lo correcto.

  • Convierta la function de Scala a la function de Kotlin
  • Progtwigción funcional: cómo continuar el context para una cadena de reglas de validation
  • Companion se beneficia de la posibilidad de implementar interfaces
  • Kotlin VS Scala: Implementar methods con parameters constructor primarios
  • Tipo de function con receptor en Scala
  • Kotlin: llaves de varias expresiones (o declaraciones)
  • Usar varios lenguajes JVM en el mismo proyecto
  • Scala require () equivalente en Kotlin
  • La creación de Gradle falló con Kotlin, Scala y Java
  • ¿Se puede usar Flink con Kotlin?
  • ¿Existe un análogo Future.sequence en kotlin?