2011-05-01 18 views
9

Si creo una función:def sin argumentos

def a(): String = return "some string" 

el resultado sería "a:() String" , así que puede utilizarlo con/sin paréntesis

Por otro lado, si creo la misma función

def a:String = return "some other string" 

sería simplemente "a: String" y en este caso no puedo usarlo con corchetes.

¿Cuál es la diferencia entre estos dos?

+4

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

+0

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

+3

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. –

Respuesta

10

La buena práctica recomienda la definición de funciones que no tienen ningún efecto secundario sin (), y para agregar la () tanto en el sitio de definición y sitio de llamada cuando la función tiene efectos secundarios (p. ej., println() en lugar de println).

6

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> 
+0

También puede reducir este método para def a = "some string". Probablemente debería reformular mi pregunta. Si no intento llamar a la segunda función con corchetes, ¿ambas variantes son la misma cosa? – Konstantin

+0

En el libro "Programación en Scala, 2da edición" página 74, hay un ejemplo de def sin argumentos. Dice: "Los paréntesis vacíos indican que la función no toma parámetros" (parenteses en el resultado del intérprete scala). Ellos son seguidos por tipo de definición. El intérprete de Scala también dice que los defs son iguales. Lo que no entiendo es por qué la segunda notación no entiende lo brackety =) Es extraño – Konstantin

Cuestiones relacionadas