Take the following controller:
package test
class TestController {
static defaultAction = "test"
def test() {
render "test"
}
}
Why is test
defined with def test() {
instead of something like void test() {
? Isn't the def
keyword only used for closures or functions in a script (i.e. not in a Groovy class)?
render
is void so in this case thetest
action could bevoid
, but in the case where you return a model map the action has to be non-void:Since some actions can return a value and some don't, the general syntax has to return
def
to support all variants.Burt's answer is correct but the real problem I was having is that I misunderstood what
def
is. Rather than being likevar
in JavaScript, you can think of it likeObject
in Java.I thought that using
def
was like doing (JavaScript)while in reality it's just like (Java)
It's not a different kind of function/closure, it's like a return type—
def
can be applied to any object (Groovy has no data primitives, so any value is also an object, unlike in Java).It helps my Java brain to think of
as