La diferencia entre métodos y funciones en Scala
Existen funciones y métodos en Scala, y la mayoría de las veces podemos ignorar la diferencia entre ellos. Pero a veces tenemos que entender la diferencia entre ellos.
Los métodos en Scala son los mismos que los métodos en Java y son parte de la clase. Los métodos tienen un nombre, una firma de tipo, a veces anotaciones y el código (código de bytes) que implementa la funcionalidad del método
.
Una función en Scala es un objeto completo. Scala abstrae el concepto de funciones con 22 rasgos. Estos 22 rasgos van desde Función1 hasta Función22.
Como se muestra en la figura anterior, Función10 representa una función con 10 parámetros formales y un valor de retorno de R (covariable).
Las funciones en Scala son en realidad objetos de clases que heredan estas características. Por ejemplo, definimos funciones a través de literales de función.
De hecho, la definición de función anterior es la misma que la siguiente. Igual:
Debido a que Function2 es un rasgo, no se puede crear directamente. Int, Int](){} en realidad define y crea una instancia de un objeto de una clase que implementa el rasgo Function2, donde clazz_company_obj es un objeto complementario de clazz.
Las diferencias específicas se resumen a continuación:
1. Los métodos no pueden existir como expresiones separadas (excepto métodos con parámetros vacíos), pero las funciones sí. Por ejemplo:
En el ejemplo anterior, primero definimos un método my luego definimos una función f. Luego usamos el nombre de la función (valor de la función) como expresión final, y dado que f en sí es un objeto (un objeto que implementa el rasgo de la FunciónN), esta es la forma correcta de usarlo. Sin embargo, si utilizamos el nombre del método como expresión final, se producirá un error.
2. Las funciones deben tener una lista de parámetros, pero los métodos no pueden tener lista de parámetros.
En el ejemplo anterior, el método m1 acepta cero parámetros, por lo que se puede omitir la lista de parámetros. Una función no puede omitir la lista de parámetros
3. El nombre del método se utiliza para las entradas del método, mientras que el nombre de la función solo representa el objeto de la función en sí.
Esto es más fácil de entender. Debido a que la variable que contiene la función literal (también llamada nombre de función o valor de función) en sí misma es un objeto de la clase que implementa el rasgo FunctionN, y para llamar al método de aplicación del objeto, debe usar la sintaxis obj(). Es por eso que llamas a una función agregando paréntesis después del nombre de la función. Como se muestra a continuación:
4. Cuando se requiere una función, si se pasa un método, expansión ETA (convierte el método en una función)
Si asignamos directamente el método a un variable, informará un error. Si especificamos que el tipo de variable es una función, se compilará correctamente, como se muestra a continuación:
Por supuesto, también podemos forzar que el método se convierta en una función, lo que requiere el uso de algunas funciones de aplicación en Scala:
p>
5. Pasar parámetros que son esencialmente métodos
La situación al pasar parámetros que son esencialmente métodos (la lista de parámetros está vacía) es de la siguiente manera:
El código anterior en realidad define un método con una lista de parámetros vacía. Dado que el nombre del método es una llamada a un método de parámetro nulo, List(x, x) en realidad realiza dos llamadas a métodos.
Dado que List(x, x) realiza dos llamadas a métodos, obtiene dos valores diferentes.
Si primero modificamos ligeramente la definición de la función m1 y el caché x, el resultado será bastante diferente al anterior.