## Metodi con parametri

Non ti senti stanco di scrivere ancora ed ancora il codice per muoverti di un numero prefissato di passi? D'altro canto creare i metodi `forward2()`, `forward3()`, `forward4()`, come anche `backward2()`, `backward3()`, `backward4()` e via dicendo, non sarebbe realmente d'aiuto, per non dir meno.

Fortunatamente è possibile passare parametri ai vostri metodi. Devi specificare il loro [!java|scala]tipo e [/!]nome dentro le parentesi tonde, dopo il nome del metodo. In seguito potrai usarli nel corpo nel metodo come se fossero variabili definite al suo interno ed aventi come valori iniziali quelli indicati dal chiamante.

    [!java|c]double [/!]divideByTwo([!java|c]double [/!]x[!scala]: Double[/!])[!scala]: Double =[/!] [!java|scala|c]{[/!][!python]:[/!]
         return x / 2[!java|c];[/!]
    [!scala|java|c]}[/!]

Dalla parte del chiamante tu dovrai specificare il valore iniziale di queste "variabili" fra le parentesi dell'invocazione.

    [!java|c]double [/!][!scala]val [/!]result = divideByTwo(3.14)[!java|c];[/!]

Se vuoi inserire più di un parametro li devi separare da una virgola (,) sia nella dichiarazione che nell'invocazione.

    [!java|c]double divide(double x, double y) {[/!]
    [!scala]def divide(x:Double, y:Double): Double = {[/!]
    [!python]def divide(x, y):[/!]
         return x / y[!java|c];[/!]
    [!java|scala|c]}[/!]

    [!java|c]double res = divide(3.14 , 1.5);[/!]
    [!scala]val res = divide(3.14 , 1.5)[/!]
    [!python]res = divide(3.14 , 1.5)[/!]

[!java|scala]

In [!thelang] puoi dichiarare diversi metodi con lo stesso nome fintantoché essi non hanno la stessa firma rappresentata dallo stesso numero e tipo di parametri.

    [!java]double maggiore(double x, double y)[/!][!scala]def maggiore(x:Double, y:Double): Double =[/!] {
      if (x > y) {
        return x;
      }
      return y;
    }
    [!java]int maggiore(int x, int y)[/!][!scala]def maggiore(x:Int, y:Int): Int =[/!] {
      if (x > y) {
        return x;
      }
      return y;
    }
    [!java]int maggiore(int x, int y; int z)[/!][!scala]def maggiore(x:Int, y:Int, z:Int): Int =[/!] {
      if (x > y && x > z) {
        return x;
      }
      if (y > z) {
        return y;
      }
      return z;
    }

Osserva che abbiamo omesso il ramo `else` per ogni `if`. La cosa funziona comunque perché il `return` interrompe l'esecuzione del metodo. Se arriviamo alla riga finale di `[!java]maggiore(int,int)[/!][!scala]maggiore(Int,Int):Int[/!]`, noi sappiamo già che `x<=y` perché in caso contrario il `return` della riga 2 avrebbe fermato l'esecuzione prima.

[/!]

### Traguardo dell'esercizio

This time, you have to write a `[!java|c]move(int stepCount,[!java]boolean[/!][!c]int[/!] forward)[/!] [!scala]move(stepCount: Int,forward: Boolean)[/!] [!python]move(stepCount,forward)[/!]` method which moves forward by `stepCount` steps if `forward` is true, and moves back of that amount of steps if the boolean is false.

Questa volta c'è solo un mondo ma sette buggles, tutti che condividono lo stesso codice. Questo codice non dovrebbe essere troppo problematico da scrivere. (Ndt in questo esercizio non è possibile utilizzare parametri per le funzioni di base forward() e backward())