Hay dos formas estándar de métodos de llamada:
obj.method(params) // dot notation
obj method (params) // operator notation
lo anterior se puede modificado de las siguientes maneras:
- Si
params
es un parámetro único, puede reemplazar ()
con {}
.
- Si
params
es un solo parámetro y está utilizando notación de operador, puede soltar el paréntesis.
- Si
method
no toma los parámetros, puede soltar (params)
(es decir, soltar el ()
vacío).
- Si
method
termina con :
, entonces realmente se une a la derecha en la notación de operador. Es decir, (params) method_: obj
es equivalente a obj.method_:(params)
.
- De cualquier forma, los espacios son opcionales siempre y cuando los identificadores se puedan diferenciar. Entonces uno puede agregar espacios a la notación de puntos, como
obj . method (params)
o escribir .method(params)
en la siguiente línea, como sucede a menudo con el encadenamiento de llamadas, así como eliminar espacios de la notación del operador, como en a+b
.
También hay algunas cosas con inferencia de tupla, pero trato de evitarlo, así que no estoy seguro de las reglas exactas.
Sin embargo, ninguno de estos explicará el ejemplo del que está confundido.Antes de explicar que, sin embargo, me gustaría mostrar algunos azúcares sintácticas que también pueden ser utilizados para llamar a métodos:
obj(params) // equivalent to obj.apply(params)
obj.x = y // equivalent to obj.x_=(y), if obj.x also exists
obj(x) = y // equivalent to obj.update(x, y)
obj op= y // equivalent to obj = obj op y, if op is symbolic
~obj // equivalent to obj.unary_~; also for !, + and -, but no other symbol
Ok, ahora al ejemplo que diste. Uno puede importar miembros de valores estables. Java puede hacerlo para métodos estáticos con su importación estática, pero Scala tiene un mecanismo más general: la importación desde paquetes, objetos o instancias comunes no es diferente: trae miembros de tipo y miembros de valor. Los métodos caen en la última categoría.
Entonces, imagine que tiene val a = 2
, y lo hace import a._
. Eso pondrá en alcance todos los métodos Int
, para que pueda llamarlos directamente. No se puede hacer +(2)
, porque eso sería interpretado como un llamado a unary_+
, pero que se podría llamar *(4)
, por ejemplo:
scala> val a = 2
a: Int = 2
scala> import a._
import a._
scala> *(4)
res16: Int = 8
Ahora, aquí es la regla. Puede llamar
method(params)
Si:
method
se ha importado a su alcance.
- se mantiene el paréntesis (incluso si sólo hay un parámetro)
Tenga en cuenta que hay un problema de prioridad también. Si escribe obj method(params)
, Scala asumirá que method
pertenece a obj
, incluso si se importó al alcance.
sí, es un cierre. estás pasando un bloque de código a un método. Tenga en cuenta que en Scala, puede usar {} en lugar de() para pasar parámetros únicos a los métodos – aishwarya
¿Qué le molesta aquí? ¿Es el bloque de código (la parte '{...}') después del nombre del método o el hecho de que no prefijamos el método con un nombre de objeto/clase? – Nicolas