为什么Grails要求我在控制器中使用`def`而不是`void`?

时间:2012-02-12 06:00:11

标签: grails groovy grails-controller

采取以下控制器:

package test

class TestController {
    static defaultAction = "test"

    def test() {
        render "test"
    }
}

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

2 个答案:

答案 0 :(得分:16)

render无效,因此在这种情况下,test操作可能是void,但如果您返回模型地图,则操作必须为非空白:

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

由于某些操作可以返回值而某些操作不返回,因此一般语法必须返回def以支持所有变体。

答案 1 :(得分:6)

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

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

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

虽然实际上它就像(Java)

public Object test() {
    return someObject;
}

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

这有助于我的Java大脑思考

def bar = "foo";

作为

Object bar = "foo";