Ci sono due modi standard di metodi di chiamata:
obj.method(params) // dot notation
obj method (params) // operator notation
quanto sopra può essere modificato nei modi seguenti:
- Se
params
è un parametro singolo, è possibile sostituire ()
con {}
.
- Se è un singolo parametro e si utilizza la notazione dell'operatore, è possibile rilasciare la parentesi.
- Se
method
non accetta parametri, è possibile eliminare (params)
(ovvero, rilasciare lo ()
vuoto).
- Se
method
termina con :
, allora si lega effettivamente a destra nella notazione dell'operatore. Cioè, (params) method_: obj
equivale a obj.method_:(params)
.
- In entrambi i casi, gli spazi sono opzionali a condizione che gli identificatori possano essere distinti. Pertanto, è possibile aggiungere spazi alla notazione punti, ad esempio
obj . method (params)
o scrivere .method(params)
nella riga successiva, come spesso accade con il concatenamento delle chiamate, nonché rimuovere gli spazi dalla notazione dell'operatore, come in a+b
.
C'è anche qualcosa con l'inferenza della tupla, ma cerco di evitarlo, quindi non sono sicuro delle regole esatte.
Nessuno di questi spiegherà comunque l'esempio di cui si è confusi.Prima di spiegare che, però, mi piacerebbe mostrare alcuni zuccheri sintattici che possono anche essere utilizzati per chiamare i metodi:
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, ora per l'esempio che ha dato. Si può importare membri di valori stabili. Java può farlo per i metodi statici con la sua importazione statica, ma Scala ha un meccanismo più generale: l'importazione da pacchetti, oggetti o istanze comuni non è diversa: porta sia membri di tipo che membri di valore. I metodi rientrano in quest'ultima categoria.
Quindi, immagina di avere val a = 2
e lo fai import a._
. Ciò porterà tutti i metodi Int
, quindi puoi chiamarli direttamente. Non si può fare +(2)
, perché sarebbe interpretato come una chiamata a unary_+
, ma si potrebbe chiamare *(4)
, ad esempio:
scala> val a = 2
a: Int = 2
scala> import a._
import a._
scala> *(4)
res16: Int = 8
Ora, qui è la regola. È possibile chiamare
method(params)
Se:
method
è stato importato in ambito.
- si mantiene la parentesi (anche se c'è un solo parametro)
Nota che c'è un problema di precedenza pure. Se si scrive obj method(params)
, Scala presumerà che method
appartiene a obj
, anche se è stato importato nell'ambito.
sì, è una chiusura. stai passando un blocco di codice in un metodo. Nota che in Scala puoi usare {} al posto di() per passare il parametro singolo ai metodi – aishwarya
Cosa ti infastidisce qui? È il blocco di codice (la parte '{...}') dopo il nome del metodo o il fatto che non facciamo il prefisso del metodo con un nome di oggetto/classe? – Nicolas