简体   繁体   中英

Anonymous code blocks in Groovy

Is there a way to use anonymous code blocks in Groovy? For example, I'm trying to translate the following Java code into Groovy:

{
  int i = 0;
  System.out.println(i);
}
int i = 10;
System.out.println(i);

The closest translation I can come up with is the following:

boolean groovyIsLame = true
if (groovyIsLame) {
  int i = 0
  println i
}
int i = 10
println i

I know anonymous code blocks are often kind of an antipattern. But having variables with names like "inputStream0" and "inputStream1" is an antipattern too, so for this code I'm working on, anonymous code blocks would be helpful.

You can use anonymous code blocks in Groovy but the syntax is ambiguous between those and closures. If you try to run this you actually get this error:

Ambiguous expression could be either a parameterless closure expression or an isolated open code block; solution: Add an explicit closure parameter list, eg {it -> ...}, or force it to be treated as an open block by giving it a label, eg L:{...} at line: 1, column: 1

Following the suggestion, you can use a label and it will allow you to use the anonymous code block. Rewriting your Java code in Groovy:

l: {
  int i = 0
  println i
}
int i = 10
println i
1.times {
    // I'm like a block.
}

What about:

({
 int i = 0
 println i
}).()

int i = 10
println i

I don't have a Groovy installation at hand, but that should do.

In Groovy, those braces constitute a closure literal. So, no can do. Personally, I'd consider having to give up anonymous blocks for getting closures a very good deal.

The most common need for an anonymous block is for additional (possibly shadowing) bindings using def . One option is to create a dictionary equivalent of your bindings and use .with . Using the example given in the question:

[i:0].with {
  println i
}

int i = 10
println i

This gives you a lisp styled let block

Why not just add if(true)

if(true) {
  int i = 0;
  System.out.println(i);
}
int i = 10;
System.out.println(i);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM