2012-10-17 8 views
13

in Groovy, il return statement is optional, che consente di scrivere metodi come:di groovy "di ritorno opzionale" semantica

def add(a, b) { 
    a + b 
} 

... che aggiunge a e b e restituisce il risultato al chiamante.

Tuttavia, mi chiedo quale sia la semantica quando il metodo ha più "dichiarazioni" di reso. Ad esempio, in Java si potrebbe avere:

String append(String a, String b) { 
    if (a == null) { 
     return b; 
    } 
    return a + b; 
} 

Questo potrebbe (ipoteticamente) essere tradotto in Groovy come:

def append(a, b) { 
    if (! a) { 
     b 
    } 
    a + b 
} 

Tuttavia, in questo caso, come fa Groovy sapere che b all'interno della if la dichiarazione dovrebbe essere restituita? O no? Suppongo che Groovy non possa semplicemente trattare qualsiasi affermazione il cui risultato non è utilizzato come return, corretto? Esistono semantiche chiaramente definite su come si comporta in questo caso la funzione "ritorno opzionale"?

+0

Solo un avviso, il collegamento di riferimento è rotto. – jmreicha

+0

@jmreicha - Grazie, risolto. – aroth

risposta

25

la pagina si è collegato (piuttosto conciso) descrive la semantica esatta:

Si noti che l'istruzione return è opzionale al termine di metodi.

Così il b in quel if blocco non sarebbe mai essere restituiti a meno che non sei tornato esplicitamente. In pratica questo significa che il valore di ritorno sarà il risultato dell'ultima dichiarazione valutata, quindi se il vostro esempio fosse

def append(a, b) { 
    if (!a) { b } 
    else { a + b } 
} 

Poi il risultato sarebbe b se !a è true e a + b altrimenti.

Il risultato di una chiamata a una funzione void è null, quindi se l'esempio fosse

def append(a,b) { 
    if (!a) { b } 
    else { a + b } 
    println "debug: $a $b" 
} 

Poi append sarebbe sempre ritorno null.

La mia regola generale per questo è di utilizzare sempre un'istruzione di reso esplicita se il metodo o chiusura contiene più di una dichiarazione. Penso che fare affidamento sull'informativa di ritorno implicita in metodi più complessi sia pericoloso, poiché se qualcuno aggiunge una linea alla fine del metodo, cambierà il valore di ritorno anche se probabilmente non lo avrebbero inteso.

+2

Ha senso. Anche se cosa avrei fatto 'else {a + b}'? In questo caso, 'b' sarebbe alla" fine "del metodo, perché non ci sarebbero istruzioni eseguibili che lo seguono. – aroth

+0

Ho aggiunto un paio di esempi aggiuntivi per approfondire ciò che la semantica di ritorno opzionale significa in pratica. –

+0

Questa è risultata essere una domanda più sottile di quella che ho dato per prima. Complimenti. –