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

Posted

技术标签:

【中文标题】为啥 Grails 要求我在控制器中使用 `def` 而不是 `void`?【英文标题】: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 类中)吗?

【问题讨论】:

【参考方案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";

【讨论】:

以上是关于为啥 Grails 要求我在控制器中使用 `def` 而不是 `void`?的主要内容,如果未能解决你的问题,请参考以下文章

Grails 重定向控制器从 https 切换到 http。为啥?

为啥当我在 grails 上删除一对多关系上的父级时,会在子级上调用 beforeInsert 事件?

Grails 命令对象自定义验证消息代码

为啥 Netbeans 无法识别我的 Grails 应用程序中的 Maven 依赖项导入?

为啥 Grails(在 Tomcat 中)同时记录到 catalina.out 和我的自定义文件附加程序?

我如何在 grails 2.3.1 中使用控制器来休息 api?