为啥 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 事件?
为啥 Netbeans 无法识别我的 Grails 应用程序中的 Maven 依赖项导入?