Funzioni
Un qualsiasi codice non può stare solo soletto, deve essere inserito all'interno del corpo di una funzione. Una funzione è un lotto di codice, una sequenza di righe di codice, che tutta insieme viene eseguita e produce un determinato risultato. Nello Snippet 2.1 abbiamo visto una funzione: la funzione main(). Essa ci permetteva di stampare a schermo "Hello World!".
La struttura di una funzione è la seguente:
fun nomeFunzione (eventuali parametri) eventuale tipo di ritorno {
// corpo della funzione
return valore di ritorno
}
Ogni funzione o metodo è preceduto dalla parola chiave fun, il tipo di ritorno viene messo dopo i parametri passati, in maniera molto simile a quella delle variabili e costanti. La keyword return permette a una funzione di specificare il valore restituito da passare al codice sorgente che ha chiamato la funzione stessa.
Caratteristiche delle funzioni
- Può avere dei parametri o meno:
fun saluta() {
println("ciao")
}
fun main(args: Array<String>) {
println("ciao")
}
- Può ritornare o meno un valore:
fun doppio(x: Int): Int {
val x1 = x + x
return x1
}
fun main(args: Array<String>) {
val y = doppio(2)
println(y)
}
- Possono vedere le variabili locali alla funzione e quelle globali, ma non quelle di altre funzioni:
var global = 20
fun altra() {
var localeAltra = 40
}
fun main(args : Array<String>) {
var localeMain = 60
println(global)
println(localeAltra) // errore
println(localeMain)
}
- Le funzioni che modificano il valore di uno o più parametri passati alla funzione si dicono con “side effects” o “mutators”:
var global = 20
fun funzione() {
global = 30 // realizza un side effect
}
- Se il corpo produce un risultato, ogni possibile ramo del flusso del codice deve restituire qualcosa o lanciare un’eccezione:
fun funzione(x : Int) : Int {
if(x == 30) return 40
if(x == 40) return 30
// errore questo ramo non ha un return
}
fun funzione(x : Int) : Int {
if(x == 30) return 40
if(x == 40) return 30
return 0
}
fun funzione(x : Int) : Int {
if(x == 30) return 40
if(x == 40) return 30
throw InvalidArgumentException(arrayOf(x.toString(),"diverso da 30 o 40"))
}
- I parametri, se più di uno, devono essere separati tramite la virgola e ogni parametro deve sempre essere tipizzato:
fun treNumeri(x:Int, y:Int, z: Int) : Int {
var somma: Int = 0
somma = x + y + z
return somma
}
fun treNumeri(x, y, z) : Int { // errore di che tipo sono x, y e z?
var somma: Int = 0
somma = x + y + z
return somma
}
fun doppio(x) : Int { // errore di che che tipo è x?
return x*2
}
Usare le funzioni
Per usare le funzioni, come già intuito, si usa il classico approccio:
val result = doppio(2)
var somma = trenumeri(1,4,6)
funzione()