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.

¿Cómo hacer que las coincidencias en línea y los argumentos por defecto funcionen juntos en Scala 3?

Tengo lo siguiente, combinando coincidencia en línea y argumento por defecto:


inline def func(myArg: (Int | String) = 0) =
inline myArg match
case i: Int => ()
case s: String => ()

Funciona bien cuando se llama sin utilizar el valor por defecto:


// funciona bien
func(1)

Sin embargo, cuando se utiliza el valor por defecto, no se compila:


// falla
func()

con

|cannot reduce inline match with

| scrutinee: myArg$proxy1 : (myArg$proxy1 : (Int | String) @uncheckedVariance)

| patterns : case i @ _:Int

| case s @ _:String

Aparentemente, el valor por defecto es un método que no está en línea. ¿Hay alguna manera de solucionarlo?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una solución para este problema. Una solución es definir un método separado con el valor predeterminado que puede ser llamado por el método en línea. Aquí hay un ejemplo:

    def defaultArg: (Int | String) = 0
    
    inline def func(myArg: (Int | String) = defaultArg) =
      inline myArg match
        case i: Int => ()
        case s: String => ()
    

    Al definir defaultArg fuera del método inline, se puede llamar sin el problema de que no sea en línea. Luego, el método inline puede llamarlo según sea necesario. Esto debería permitir a la llamada func() con el argumento predeterminado compilar sin problema.

Comments are closed.