Основной код псевдо вбежал eachLine
является:
while (true) {
def line = readLineFromFile()
if (line==null) {
break
}
closure(line, count++)
}
Так что нет ничего другого, чем конец файл, чтобы остановить. Ваш return
в закрытии работает, но он возвращает только от закрытие.
Подробнее см. В источнике org.codehaus.groovy.runtime.IOGroovyMethods.eachLine
.
Закрытие - это не языковые конструкции, такие как while
или for
. Они просто передаются анонимными функциями с контекстом. Это становится более ясным, если вы напишете его, что код на самом деле означает (без заводной ярлыки): inputFile.eachLine({it,i->...})
(обратите внимание, что() из вызова метода здесь)
В общем: each.*
в Groovy не заботится результат вашего закрытия. Возвращение в закрытии означает только раннюю выручку (в вашем случае это не-op).
Так что для общего вопроса, можете ли вы break
от закрытия? «Нет». Iff ваш абонент работает с результатом, состоянием, ... от закрытия каким-либо образом до разрешает вы от него отказаться (например, [].find()
делает: итерирует список, пока закрытие не вернет true, а затем вернет элемент), вы не могут (ну вы можете выбросить исключение).
Вот очень хорошее объяснение: http://stackoverflow.com/questions/3049790/break- from-groovy-each-clos – Opal
Да, я просто прочитал это на самом деле, сейчас я хочу изменить свой вопрос. Я все еще хотел бы знать, почему это так – KBusc