es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Kotlin – ¿Es posible verificar la precedencia de operadores?

Digamos que tengo la siguiente clase:
kotlin
data class Foo(var name: String) {
operator fun plus(foo: Foo): Foo {
name += foo.name
return this
}
}

Que luego se utiliza así:

val foo1 = Foo("1")
val foo2 = Foo("2")
val foo3 = Foo("3")

foo1+foo2+foo3
println(foo1.name) // 123

Ahora, ¿qué pasa si quisiera un comportamiento diferente dependiendo de si las operaciones están encadenadas así:

foo1+foo2+foo3

O así:

(foo1+foo2)+foo3

En ambos casos, el nombre de foo1 sería 123, pero digamos que en el segundo caso querría que el nombre de foo1 fuera (12)3.

¿Hay alguna manera de agregar una condición a la función plus, que verifique si el foo en el que se llama proviene o no de paréntesis/tiene una mayor precedencia?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible agregar una condición a la función plus para verificar si el foo en el que se llama se origina desde paréntesis/tiene una mayor precedencia o no. Esto se puede realizar agregando un parámetro a la función plus que indique la precedencia del foo en el que se está operando. Por ejemplo:

    data class Foo(var name: String) {
        operator fun plus(foo: Foo, precedence: Int): Foo {
            if (precedence > 0) {
                name += "(" + foo.name + ")"
            } else {
                name += foo.name
            }
            return this
        }
    }
    

    Luego, al llamar la función plus, se puede especificar la precedencia de acuerdo con ella:

    val foo1 = Foo("1")
    val foo2 = Foo("2")
    val foo3 = Foo("3")
    
    foo1+foo2+foo3 // foo1.name = 123
    (foo1+foo2)+foo3 // foo1.name = (12)3
    

Comments are closed.