【问题标题】:Why does Grails require that I use `def` instead of `void` in a controller?为什么 Grails 要求我在控制器中使用 `def` 而不是 `void`?
【发布时间】:2012-03-04 01:06:25
【问题描述】:
采取以下控制器:
package test
class TestController {
static defaultAction = "test"
def test() {
render "test"
}
}
为什么test 定义为def test() { 而不是void test() {? def 关键字不是仅用于脚本中的闭包或函数(即不在 Groovy 类中)吗?
【问题讨论】:
标签:
grails
groovy
grails-controller
【解决方案1】:
render 是无效的,所以在这种情况下,test 操作可能是 void,但在您返回模型映射的情况下,操作必须是非无效的:
def create() {
[personInstance: new Person(params)]
}
由于有些操作可以返回值而有些不能,因此一般语法必须返回 def 以支持所有变体。
【解决方案2】:
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";