Подтвердить что ты не робот

Groovy "необязательная возвратная" семантика

В Groovy оператор является необязательным, позволяя вам писать такие методы, как:

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

... который добавляет a и b и возвращает результат вызывающему.

Однако мне интересно, что такое семантика, когда метод имеет несколько возвратных "операторов". Например, на Java может быть:

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

Это можно (гипотетически) перевести на Groovy как:

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

Однако, в этом случае, как Groovy знает, что b внутри оператора if должен быть возвращен? Или это не так? Я предполагаю, что Groovy не может просто обрабатывать любое утверждение, результат которого не используется как return, правильно? Есть ли четко определенная семантика того, как ведет себя функция "необязательного возвращения" в этом случае?

4b9b3361

Ответ 1

Связанная с вами страница (точнее всего) описывает точную семантику:

Обратите внимание, что оператор return является необязательным в конце методов.

Таким образом, b в этом блоке if никогда не будет возвращен, если вы явно не вернете его. На практике это означает, что возвращаемое значение будет результатом вычисления последнего оператора, поэтому, если ваш пример был

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

Тогда результат будет b, если !a равен true и a + b в противном случае.

Результатом вызова функции void является null, поэтому, если в примере были

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

Тогда append всегда будет возвращать null.

Мое собственное правило для этого - всегда использовать явный оператор return, если метод или замыкание содержит более одного оператора. Я полагаю, что полагаться на неявный оператор return в более сложных методах опасен, поскольку, если кто-то добавит строку в конец метода, они изменят возвращаемое значение, даже если они, скорее всего, не намеревались.