Scalera tips : parámetros por defecto y sobrecarga

Hoy toca un post breve pero espero que descubra algo nuevo para algunos. Hoy hablaremos de los problemas que puede dar la sobrecarga al tener parámetros por defecto.

Vamos a empezar definiendo los conceptos básicos:

– Sobrecarga: …really?
– Parámetros por defecto: en Scala, es posible definir parámetros por defecto en los métodos. Estos parámetros nos permitirán obviar algunos parámetros en su llamada. Vamos a ver un ejemplo:

def getUri(host: String = "localhost", port: Int = 8080): String = "$host:$port"

getUri("127.0.0.1", 8081) //"127.0.0.1:8081"
getUri(port = 8081) //"localhost:8081"
getUri("127.0.0.1") //"127.0.0.1:8080"
getUri() //"localhost:8080"

Genial…y ¿cuál es el problema?

Vamos a crear el siguiente trait:

trait A {
  def a(a: Int, p: Boolean = false)
  def a(b: Boolean = false)
}

y ahora compilamos y…

giphy2

error: in trait A, multiple overloaded alternatives of method a define default arguments.

Sin embargo, si quitamos el parámetro por defecto de la primera función:

trait A {
  def a(a: Int, p: Boolean)
  def a(b: Boolean = false)
}

y compilamos …..

giphy1

todo va bien.

¿Cuál es la causa de este kilombo?

El problema es que el compilador utilizará los parámetros por defecto para generar los nombres de unas funciones auxiliares que utilizará para tratar los método con valores por defecto (no olvidemos que seguimos en la JVM). Veamos el ejemplo que aparece en la documentación:

def f(a: Int = 1, b: String)
// generates a method: def f$default$1 = 1
f(b = "3")
// transformed to: f(b = "3", a = f$default$1)

Como se puede observar, se genera una nueva función y se sobreescribe la llamada al método original haciendo uso de dicha función.

Después de esto, podemos decir que en el primer caso de nuestro kilombo, las dos funciones auxiliares creadas tendrán este nombre:

def a$default$1 = false

y por ello se producirá un conflicto de nombres.

En el segundo caso, al no existir un parámetro por defecto en el primer método, solo se generará una nueva función y, por tanto, no se producirá ningún conflicto.

Y hasta aquí el post 🙂

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s