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()

results matching ""

    No results matching ""