Si define a
así, sin paréntesis (nota, la palabra clave return
no es necesario):
def a: String = "some other string"
y luego llamarlo con paréntesis: a()
, entonces el ()
no es la lista de argumentos vacía para el método a
; en su lugar, Scala intentará aplicar el ()
a la cadena que devuelve el método a
. El mensaje de error que se obtiene cuando se intenta que los consejos a que:
scala> a()
<console>:7: error: not enough arguments for method apply: (n: Int)Char in trait StringLike.
Unspecified value parameter n.
a()
^
Así, en el segundo caso, a()
significa otra cosa que en el primer caso. En el primer caso, solo significa "llamar al a
con una lista de argumentos vacía", y en el segundo caso significa "llamar al a
, luego aplicar ()
al resultado del método", que fallará en un String
.
editar Para ampliar su segunda pregunta en los comentarios a continuación, depende de qué quiere decir exactamente "lo mismo". Como viste en el REPL, parece que tiene el tipo ()java.lang.String
, mientras que el otro tiene el tipo java.lang.String
. Echar un vistazo a la siguiente, en la que x
y y
su vez en lo mismo:
scala> def a() = "aaa"
a:()java.lang.String
scala> def b = "bbb"
b: java.lang.String
scala> val x = a _
x:() => java.lang.String = <function0>
scala> val y = b _
y:() => java.lang.String = <function0>
Nota: Puede omitir la palabra clave 'return' - en Scala, el resultado de un método es el valor de la última expresión en el método. – Jesper
También puede evitar especificar el tipo de definición. Solo quería señalar que es una función, para que todos lo vean de inmediato =) – Konstantin
Pero no es una función, es un método. :) Y entiendo esto por la palabra clave 'def', ¿no? Como la mayoría de las veces, 'return' queda fuera. –