Замыкания не могут прерываться или продолжаться, потому что они не являются конструкциями цикла / итерации. Вместо этого они являются инструментами, используемыми для обработки / интерпретации / обработки итеративной логики. Вы можете игнорировать данные итерации, просто возвращаясь из замыкания без обработки, как в:
revs.eachLine { line ->
if (line ==~ /-{28}/) {
return
}
}
Поддержка разрыва не происходит на уровне замыкания, а подразумевается семантикой вызова метода, принимающего замыкание. Короче говоря, это означает, что вместо вызова «each» для чего-то вроде коллекции, которая предназначена для обработки всей коллекции, вы должны вызвать find, которая будет обрабатывать, пока не будет выполнено определенное условие. В большинстве случаев (все?) Вы чувствуете необходимость отойти от замыкания. То, что вы действительно хотите сделать, - это найти определенное условие во время итерации, что делает метод find соответствующим не только вашим логическим потребностям, но и вашим намерениям. К сожалению, некоторые API не поддерживают метод find ... Файл, например. Вполне возможно, что все время, затрачиваемое на споры о том, должен ли язык включать прерывание / продолжение, можно было бы потратить на то, чтобы добавить метод поиска к этим забытым областям. Что-то вроде firstDirMatching (Closure c) или findLineMatching (Closure c) будет иметь большое значение и ответит на 99 +% вопросов «почему я не могу оторваться от ...?» вопросы, которые появляются в списках рассылки. Тем не менее, добавить эти методы самостоятельно через MetaClass или Categories просто.
class FileSupport {
public static String findLineMatching(File f, Closure c) {
f.withInputStream {
def r = new BufferedReader(new InputStreamReader(it))
for(def l = r.readLine(); null!=l; l = r.readLine())
if(c.call(l)) return l
return null
}
}
}
using(FileSupport) { new File("/home/me/some.txt").findLineMatching { line ==~ /-{28}/ }
Другие хаки, включающие исключения и другое волшебство, могут работать, но в некоторых ситуациях приводить к дополнительным издержкам и усложнять читаемость в других. Правильный ответ - взглянуть на ваш код и спросить, действительно ли вы выполняете итерацию или выполняете поиск.