sintaxis programar introduccion instanciar crear clases clase scala

programar - scala introduccion



¿Cómo definir un método en Scala que devuelve un tipo? (1)

Solo debes poner = :

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

Si no pone = entre la firma del método y el cuerpo, entonces el tipo de retorno es Unit , por lo que esto:

def m(i: Int) {}

es lo mismo que

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

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

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

Como puede ver, defino 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 el método que genera una nueva función cada vez que lo llamas:

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

Pero es importante comprender que ese 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ás hablando sobre el Capítulo 2 - Paso 3 (en la introducción)

Como puede ver, la función max está definida en REPL, y es realmente una función. En realidad también puedes escribir algo como esto:

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

En este caso, myMethod es un método y myInnerFn es una función. Entonces, como puedes ver, depende mucho del contexto. Creo que esta sintaxis para myInnerFn es solo azúcar sintáctica para (necesito mirar las especificaciones para decir con seguridad):

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

Lo mismo sucede en REPL. Y por cierto eso es porque escribí al principio:

Si lo define dentro de la definición de object , class o trait

Lo siento, necesito ser más claro al respecto y describirlo con más detalle en mi segunda actualización.

Miré en las especificaciones de Scala. Parece que no estoy totalmente en lo cierto cuando digo que myInnerFn es azúcar sintáctica para la función. Pero parece que se llama tipo de método . Puede encontrarlo en la sección de especificaciones 3.3.1 Tipo de método :

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

Espero que te dé 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 ningún valor (o, en el contexto de Scala, devuelve la Unit )

Y en segundo contexto:

  • Función: pieza ejecutable de código que se puede pasar y tratar como valor
  • Método - pertenece a la clase

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

Una cosa más. Las Secciones 8.1, 8.2, 8.3 de Programación en Scala pueden ayudarlo a comprender esta terminología. Y si estoy en lo cierto en mis suposiciones, lo que piensas como Function se llama función de First-class function en el libro (se describe en la sección 8.3).

Espero que esto ayude

Quiero definir un método privado en scala singleton class que parezca;

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

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

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

Gracias Ángel fácil por la respuesta. Todavía hay algo de confusión. Según el libro Programación en Scala escrito por el inventor del lenguaje, la siguiente es una función:

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

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

¿Qué es REPL?