Блоки анонимного кода в Groovy - PullRequest
12 голосов
/ 20 апреля 2010

Есть ли способ использовать блоки анонимного кода в Groovy? Например, я пытаюсь перевести следующий код Java в Groovy:

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

Ближайший перевод, который я могу придумать, следующий:

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

Я знаю, что блоки анонимного кода часто являются антипаттерном. Но наличие переменных с именами, такими как «inputStream0» и «inputStream1» также является антипаттерном, поэтому для этого кода, над которым я работаю, блоки анонимного кода были бы полезны.

Ответы [ 5 ]

16 голосов
/ 20 апреля 2010

Вы можете использовать блоки анонимного кода в Groovy, но синтаксис между ними и замыканиями неоднозначен. Если вы попытаетесь запустить это, вы действительно получите эту ошибку:

Неоднозначное выражение может быть выражение без параметров или изолированный блок открытого кода; решение: Добавить явный параметр закрытия список, например {это -> ...}, или заставить его рассматриваться как открытый блок, давая это ярлык, например L: {...} в строке: 1, колонка: 1

Следуя предложению, вы можете использовать метку, и она позволит вам использовать блок анонимного кода. Переписать ваш Java-код в Groovy:

l: {
  int i = 0
  println i
}
int i = 10
println i
6 голосов
/ 22 октября 2011
1.times {
    // I'm like a block.
}
2 голосов
/ 20 апреля 2010

А как же:

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

int i = 10
println i

У меня под рукой нет Groovy, но это должно сработать.

1 голос
/ 20 апреля 2010

В Groovy эти скобки составляют буквальное закрытие. Так что, не могу сделать. Лично я бы посоветовал отказаться от анонимных блоков для получения замыканий.

0 голосов
/ 02 июня 2014

Наиболее распространенная потребность в анонимном блоке - для дополнительных (возможно, теневых) привязок с использованием def. Один из вариантов - создать словарный эквивалент ваших привязок и использовать .with. Используя пример, приведенный в вопросе:

[i:0].with {
  println i
}

int i = 10
println i

Это дает вам блок в стиле let lisp

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...