¿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:
- Sistema local de administración de packages Java en Python PIP style?
- La creación de Gradle falló con Kotlin, Scala y Java
- Biblioteca Headless de una fuente para JVM y JavaScript
- ¿Existe un análogo Future.sequence en kotlin?
- ¿Cómo hacer que los constructores seguros de Kotlin trabajen en Scala?
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?
- Usar varios lenguajes JVM en el mismo proyecto
- Comstackción manual de JAR para Scala & Kotlin
- Tipo de function con receptor en Scala
- ¿Cómo funcionan las funciones de extensión de Kotlin?
- ¿Se puede usar Flink con Kotlin?
- ¿Por qué el comstackdor de Scala me da un error al pasar una class sellada de Kotlin a un constructor?
- Progtwigción funcional: cómo continuar el context para una cadena de reglas de validation
- Convierta la function de Scala a la function de Kotlin
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.
- Método abstracto de Kotlin con cuerpo
- ¿Hay un equivalente en Kotlin para Swift init (se repite: count :)