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

Tom*_*nal 8 grails groovy grails-controller

拿以下控制器:

package test

class TestController {
    static defaultAction = "test"

    def test() {
        render "test"
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么test定义def test() {而不是像void test() {?是不是def只在一个脚本用于关闭或功能(即不是在Groovy类)的关键字?

Bur*_*ith 16

render是无效的,所以在这种情况下test动作可能是void,但是如果你返回一个模型图,那么动作必须是非空的:

def create() {
   [personInstance: new Person(params)]
}
Run Code Online (Sandbox Code Playgroud)

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


Tom*_*nal 6

伯特的回答是正确的,但我遇到的真正问题是我误解了def是什么.而不是像var在JavaScript中一样,你可以像Object在Java中一样思考它.

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

var test = function() {
    alert("test");
}
Run Code Online (Sandbox Code Playgroud)

而实际上它就像(Java)

public Object test() {
    return someObject;
}
Run Code Online (Sandbox Code Playgroud)

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

它有助于我的Java大脑思考

def bar = "foo";
Run Code Online (Sandbox Code Playgroud)

Object bar = "foo";
Run Code Online (Sandbox Code Playgroud)