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
otrait
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?