2011-06-15 18 views
21

Quiero definir un método privado en la clase Scala Singleton que se parece a;¿Cómo se define un método en Scala que devuelve un tipo?

private def createDomNode(tag: String, attrs: Map[String , String]): DomNode { 

} 

DomNode es de tipo Java, no de tipo scala. attrs es Scala Map con clave y valor de tipo String.

Pero arriba da error. ¿Cuál es el formato correcto?

Gracias Easy Angel por la respuesta. Todavía hay algo de confusión. De acuerdo a la programación en Scala libro escrito por el inventor de la lengua, el siguiente es una función:

def max(x: Int, y: Int): Int = { 
    if (x > y) x 
    else y 
} 

Pero su respuesta dice que es método y no la función. ¿Puedes explicar amablemente?

¿Qué es REPL?

+0

REPL significa 'read-eval-print loop', un shell interactivo. Puede iniciar Scala REPL ejecutando el programa de línea de comando 'scala'. – kassens

+0

Esto podría ayudar con el método frente a la confusión función: http://stackoverflow.com/questions/3926047/debunking-scala-myths/4812176#4812176. –

+0

No mezcle las preguntas juntas, que solo están conectadas aleatoriamente (REPL, función/método, primera pregunta). –

Respuesta

42

Solamente debe incluir =:

private def createDomNode(tag: String, attrs: Map[String , String]): DomNode = { 
    // ... 
} 

Si no va a poner = entre firma del método y el cuerpo, y luego volver tipo es Unit, por lo que este:

def m(i: Int) {} 

es lo mismo que

def m(i: Int): Unit = {} 

Respuesta al comentario: Lo que describí anteriormente es en realidad el método, si lo define en object, class o trait definición. sintaxis de la función se vería así:

val createDomNode: (String, Map[String , String]) => DomNode = { (tag, attrs) => 
    // ... 
} 

Como se puede ver que definen val con el nombre createDomNode del tipo de función. También se puede escribir como:

val createDomNode: Function2[String, Map[String , String], DomNode] = { (tag, attrs) => 
    // ... 
} 

aquí hay otro ejemplo. En este caso defino método que genera nueva función cada vez que la llame:

def createDomNode = (tag: String, attrs: Map[String , String]) => new DomNode 

Pero es importante entender, que el método devuelve una "función que devuelve DomNode" en este caso, pero no DomNode sí.


acerca de la programación en referencia Scala. Creo que está hablando de Capítulo 2 - Paso 3 (en la introducción)

Como puede ver, la función max se define en REPL, y en realidad es una función. En realidad también se puede escribir algo como esto:

class MyClass { 
    def myMethod(i: Int): Int = { 
     def myInnerFn(x: Int) = x * x 

     myInnerFn(i) 
    } 
} 

En este caso es myMethod método y myInnerFn es función. Como puede ver, depende mucho del contexto.Creo que esta sintaxis para myInnerFn es simplemente azúcar sintáctica para (tengo que mirar dentro de las especificaciones con el fin de decir con seguridad):

val myInnerFn = (x: Int) => x * x 

Lo mismo sucede en REPL. Y por cierto que es porque escribí al comienzo:

si se define dentro de object, class o trait definición

Lo siento, tienen que ser más claro acerca de esto y lo describen en más detalle en mi segunda actualización.


Miré en la especificación de Scala. Parece que no estoy totalmente en lo cierto cuando digo que myInnerFn es azúcar sintáctico para la función. pero parece que se llama Método Tipo. Lo puede encontrar en la sección de especificaciones Tipo 3.3.1 Método:

http://www.scala-lang.org/docu/files/ScalaReference.pdf

esperamos que le permita dar alguna pista, si quieres profundizar más en esto. Creo que es fácil perderse en la terminología. Puede function en 2 contextos. En primer lugar tenemos

  • Función - devuelve algún valor
  • Procedimiento - no devuelve nada (o en el contexto Scala se devuelve Unit)

Y en segundo contexto:

  • Función - pieza de código ejecutable que puede ser pasa alrededor y se trata como valor
  • Método - pertenece a la clase

y que a veces no está claro en qué contexto que significaba. Por ejemplo, yo puedo decir que es myMethod como función simplemente porque tiene un valor de retorno (o en otras palabras: myMethod no es procedimiento). Creo que es el mismo caso en el libro.


Una cosa más. Secciones 8.1, 8.2, 8.3 de Programación en Scala pueden ayudar a entender esta terminología. Y si no me equivoco en mis suposiciones, lo que usted piensa que se llama FunctionFirst-class function en el libro (se describe en la sección 8.3).

Espero que esto ayude

+0

Pero al poner un igual lo cambiaremos a una función scala y no a un método scala. – ace

+0

Quiero el método y no la función. – ace

+3

@amc: Agregar el signo igual * no * lo cambia a una función scala. Si haces toda la cosa 'val createDomNode = (...) =>', entonces obtienes una función. –

Cuestiones relacionadas