Почему Grails требует, чтобы я использовал `def` вместо` void` в контроллере? - PullRequest
8 голосов
/ 12 февраля 2012

Возьмите следующий контроллер:

package test

class TestController {
    static defaultAction = "test"

    def test() {
        render "test"
    }
}

Почему test определяется с def test() { вместо чего-то вроде void test() {?Разве ключевое слово def не используется только для замыканий или функций в сценарии (т.е. не в классе Groovy)?

Ответы [ 2 ]

16 голосов
/ 12 февраля 2012

render является недействительным, поэтому в этом случае действие test может быть void, но в случае, когда вы возвращаете карту модели, действие должно быть не пустым:

def create() {
   [personInstance: new Person(params)]
}

Поскольку некоторые действия могут возвращать значение, а некоторые нет, общий синтаксис должен возвращать def для поддержки всех вариантов.

6 голосов
/ 12 февраля 2012

Ответ Берта правильный, но реальная проблема, с которой я столкнулся, заключается в том, что я неправильно понял, что такое def.Вместо того, чтобы быть var в JavaScript, вы можете думать об этом как Object в Java.

Я думал, что использование def похоже на выполнение (JavaScript)

var test = function() {
    alert("test");
}

в то время как в действительности это так же, как (Java)

public Object test() {
    return someObject;
}

Это не другой тип функции / замыкания, это как тип возврата - def может применяться к любому объекту (Groovy не имеет примитивов данных,поэтому любое значение также является объектом, в отличие от Java).

Это помогает моему мозгу Java думать о

def bar = "foo";

как

Object bar = "foo";
...