2012-01-23 11 views
6

me gustaría hacer en Scala algo que haría en Java como esto:Scala nulo como valor por defecto para el parámetro Int llamado

public void recv(String from) { 
    recv(from, null); 
} 
public void recv(String from, Integer key) { 
    /* if key defined do some preliminary work */ 
    /* do real work */ 
} 

// case 1 
recv("/x/y/z"); 
// case 2 
recv("/x/y/z", 1); 

En Scala que podía hacer:

def recv(from: String, 
     key: Int = null.asInstanceOf[Int]) { 
    /* ... */ 
} 

pero se ve feo. O podría hacer:

def recv(from: String, 
     key: Option[Int] = None) { 
    /* ... */ 
} 

pero ahora llamada con la tecla se ve feo:

// case 2 
recv("/x/y/z", Some(1)); 

¿Cuál es la correcta Scala manera? Gracias.

+0

¿qué pasa con el valor por defecto = -1 o 0? – sschaef

+0

@Antoras Es posible, pero no elegante (supongamos que la clave puede ser cualquier valor Int). – woky

+3

"Algunos" dejarán de parecer feos una vez que te salve de algunas docenas de NullPointerExceptions :) –

Respuesta

15

La manera Option es la manera de Scala. Puede hacer que el código de usuario sea un poco más agradable al proporcionar métodos de ayuda.

private def recv(from: String, key: Option[Int]) { 
    /* ... */ 
} 

def recv(from: String, key: Int) { 
    recv(from, Some(key)) 
} 

def recv(from: String) { 
    recv(from, None) 
} 

null.asInstanceOf[Int] evalúa a 0 por cierto.

+0

¡No sabía que puedo "sobrecargar" los métodos en Scala, gracias! – woky

+1

Hmm, me gustaría simplemente poner el '/ * trabajo operativo preliminar * /' del OP en la sobrecarga de dos métodos, y luego hice que llamara a la sobrecarga de un método que hace '/ * hacer trabajo real * /'? ¿El uso de 'Option' es más idiomático que Scala? –

+0

@TimGoodman, "luego tuve que llamar a la sobrecarga de un método" - ¿con qué argumento? – missingfaktor

2

La forma correcta es, por supuesto, utilizar Option. Si tiene problemas con su apariencia, siempre puede recurrir a lo que hizo en Java: use java.lang.Integer.

3

Option realmente suena como la solución correcta para su problema - realmente desea tener un "opcional" Int.

Si usted está preocupado acerca de las personas que llaman tener que utilizar Some, por qué no:

def recv(from: String) { 
    recv(from, None) 
} 

def recv(from: String, key: Int) { 
    recv(from, Some(key)) 
} 

def recv(from: String, key: Option[Int]) { 
    ... 
} 
+0

¡No sabía que puedo" sobrecargar "los métodos en Scala, gracias! – woky

Cuestiones relacionadas