2014-10-23 3 views
0

У меня есть следующий простой строгий скрипт, который, как я понимаю, не будет работать после прочтения here. Но теперь мой вопрос заключается в том, почему это не выходит из закрытия. Может кто-то дать объяснение или момент мой на документы, которые обсуждают closures.ThanksGroovy println затем перерыв от закрытия

def inputFile = new File("input.txt") 
inputFile.eachLine{ it ,i -> 
    if(it.contains("abcd")){ 
    println "abcd found on line: " + i 
    return true 
    } 
} 
+0

Вот очень хорошее объяснение: http://stackoverflow.com/questions/3049790/break- from-groovy-each-clos – Opal

+0

Да, я просто прочитал это на самом деле, сейчас я хочу изменить свой вопрос. Я все еще хотел бы знать, почему это так – KBusc

ответ

2

Основной код псевдо вбежал 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, а затем вернет элемент), вы не могут (ну вы можете выбросить исключение).

1

Методы Groovy's each* НЕ выходят из цикла, если вы вернетесь в его «тело». они просто отменяют выполнение этого экземпляра тела и переходят к следующему.

Напротив, метод «find» возвращается немедленно, если закрытие возвращает true.

Вы можете использовать равнину зацикливания с for или while, или (не рекомендуется) пусть ваше закрытие проливает исключение

Смежные вопросы