采取以下控制器:
package test
class TestController {
static defaultAction = "test"
def test() {
render "test"
}
}
为什么test
定义def test() {
而不是void test() {
? def
关键字不仅用于脚本中的闭包或函数(即不在Groovy类中)吗?
答案 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";