8

采取以下控制器:

package test

class TestController {
    static defaultAction = "test"

    def test() {
        render "test"
    }
}

为什么testdef test() {而不是类似的东西定义void test() {?关键字不是def仅用于脚本中的闭包或函数(即不在 Groovy 类中)吗?

4

2 回答 2

16

render是无效的,所以在这种情况下,test动作可能是void,但在您返回模型映射的情况下,动作必须是非无效的:

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

由于有些动作可以返回一个值而有些则不能,所以通用语法必须返回def以支持所有变体。

于 2012-02-12T06:59:19.893 回答
6

Burt 的回答是正确的,但我遇到的真正问题是我误解了def它的含义。var你可以把它想象成Java 中的样子,而不是像JavaScript 中的那样Object

我认为使用def就像做(JavaScript)

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

而实际上它就像(Java)

public Object test() {
    return someObject;
}

它不是一种不同的函数/闭包,它就像一个返回类型——<code>def 可以应用于任何对象(Groovy 没有数据原语,所以任何值也是一个对象,这与 Java 不同)。

它帮助我的 Java 大脑思考

def bar = "foo";

作为

Object bar = "foo";
于 2012-02-12T07:25:12.800 回答