Groovy, Sometimes You Still Need a Semicolon.
Like Javascript, semicolons are optional in Groovy except for when they
aren't optional. These examples are both pretty contrived, though I
found both because they're actually something that I've written, and
could both be written better. That's not really the point I'm making
though. When something doesn't compile when it looks like it clearly
should sometimes it's hard to track down why, and it's surprising to
learn that it's because you need a semicolon.
Example the first: Generics at the end of a line:
If you try to compile this in Groovy it will give you the error message: 'unexpected token: println', however this:
Example the second: Ambiguous Closures
I don't think you'd really ever need to do something like this, but a closure can be defined and called on a single line. Because of Groovy's special closure parameter syntax (e.g. list.each() {} being synonomous with list.each({})) the compiler thinks I'm passing the second closure into the first as an argument. Again a semicolon is needed to seperate the two lines:
Example the first: Generics at the end of a line:
def list = [1,2,3] as List<Integer> println list
If you try to compile this in Groovy it will give you the error message: 'unexpected token: println', however this:
def list = [1,2,3] as List<Integer>; println listGives the expected output.
Example the second: Ambiguous Closures
{-> assert GroovyClosureTest == owner.getClass() }()
{-> assert GroovyClosureTest == delegate.getClass() }()
I don't think you'd really ever need to do something like this, but a closure can be defined and called on a single line. Because of Groovy's special closure parameter syntax (e.g. list.each() {} being synonomous with list.each({})) the compiler thinks I'm passing the second closure into the first as an argument. Again a semicolon is needed to seperate the two lines:
{-> assert GroovyClosureTest == owner.getClass() }();
{-> assert GroovyClosureTest == delegate.getClass() }()
From
Tags:
Published at DZone with permission of Scott Leberknight, author and DZone MVB.(Note: Opinions expressed in this article and its replies are the opinions of their respective authors and not those of DZone, Inc.)





Comments
Matthew Passell replied on Fri, 2009/11/06 - 12:10pm
I'm not sure about the second one, but the first might just be a compiler bug. Have you asked the Groovy team?
--MattThe Software Grove
Octavian Covalschi replied on Sun, 2009/11/08 - 7:56pm
What version are you using? I've just tried 1st example with 1.6.4 and it compiles and runs fine.
class App {public static void main(String[] args) {
def list = [1,3,4,5,6] as List<Integer>
println list
}
}
I've tried both in Eclipse and groovyConosole.
Thanks.
John Cato replied on Mon, 2009/11/09 - 11:35am
in response to: octix
The generics problem doesn't compile in 1.5.5 (which we're stuck on at the moment because of a Groovy/JAXB problem) so it looks like that one has been resolved.