2012-10-17 13 views
13

W Groovy The return statement is optional, dzięki czemu można napisać metod takich jak:Groovy jest opcja "powrót" semantyka

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

... który dodaje a i b i zwraca wynik do rozmówcy.

Jednak zastanawiam się, co to jest semantyka, gdy metoda ma wiele zwrotów "stwierdzeń". Na przykład w Javie może mieć:

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

To może (hipotetycznie) być tłumaczone na Groovy jak:

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

Jednak w tym przypadku, w jaki sposób Groovy że b wnętrza if oświadczenie powinno zostać zwrócone? A może nie? Zakładam, że Groovy nie może po prostu potraktować żadnego stwierdzenia, którego wynik jest nieużywany jako return, zgadza się? Czy istnieje jakaś jasno określona semantyka dotycząca zachowania funkcji "Opcjonalny powrót" w tym przypadku?

+0

Tylko jedna osoba w górę, link, do którego się odwołujesz, jest zepsuty. – jmreicha

+0

@jmreicha - Dzięki, naprawione. – aroth

Odpowiedz

25

Strona którą związany (raczej krótko) opisuje dokładnie semantyka:

Zauważ, że instrukcja return jest opcjonalna w końcu metod.

Tak więc b w tym bloku nigdy nie zostanie zwrócony, dopóki nie zostanie jawnie zwrócony. W praktyce oznacza to, że wartość zwracana będzie wynik ostatniego oświadczenia oceniane, więc jeśli przykładem były

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

wtedy wynik byłby b jeśli !a jest true i a + b inaczej.

Efektem połączenia do void funkcji jest null, więc jeśli przykładem były

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

Następnie append zawsze powrócić null.

Moja własna zasada jest taka, aby zawsze używać wyraźnej instrukcji return, jeśli metoda lub zamknięcie zawiera więcej niż jedną instrukcję. Myślę, że poleganie na niejawnym oświadczeniu zwrotnym w bardziej złożonych metodach jest niebezpieczne, ponieważ jeśli ktoś doda linię na końcu metody, zmieni wartość zwrotu, nawet jeśli najprawdopodobniej nie zamierzali tego zrobić.

+2

Ma sens. A co jeśli zrobiłem "else {a + b}"? W takim przypadku 'b' będzie na" końcu "metody, ponieważ po niej nie byłoby instrukcji wykonawczych. – aroth

+0

Dodałem kilka dodatkowych przykładów, aby opracować, co w praktyce oznacza opcjonalna zwrotna semantyka. –

+0

To okazało się bardziej subtelne pytanie, niż wcześniej przyznałem. Sława. –