Можете ли вы оторваться от Groovy & ldquo; каждый & rdquo; закрытие?

Во-первых, вам нужно вызвать blur () в окне, которое находится сверху. Затем вызовите focus () в окне, которое вы хотите вызвать в начало.

Также обратите внимание, что в браузерах в наши дни есть блокирующие всплывающие окна, которые мешают вам это делать, и вы должны отключить их.

140
задан ArtB 28 July 2017 в 22:32
поделиться

2 ответа

Нет, вы не можете прервать "каждый" без создания исключения. Скорее всего, вам понадобится классический цикл, если вы хотите, чтобы прерывание прерывалось при определенных условиях.

В качестве альтернативы вы можете использовать замыкание «find» вместо each и вернуть true, когда вы сделали бы перерыв.

Этот пример прерывается перед обработкой всего списка:

def a = [1, 2, 3, 4, 5, 6, 7]

a.find { 
    if (it > 5) return true // break
    println it  // do the stuff that you wanted to before break
    return false // keep looping
}

Выводит

1
2
3
4
5

, но не выводит 6 или 7.

Также очень легко написать свои собственные методы итератора с настраиваемым поведением прерывания, которое допускает замыкания:

List.metaClass.eachUntilGreaterThanFive = { closure ->
    for ( value in delegate ) {
        if ( value  > 5 ) break
        closure(value)
    }
}

def a = [1, 2, 3, 4, 5, 6, 7]

a.eachUntilGreaterThanFive {
    println it
}

Также напечатано:

1
2
3
4
5    
187
ответ дан 23 November 2019 в 23:05
поделиться

Нет, вы не может выйти из закрытия в Groovy без исключения исключения. Кроме того, вы не должны использовать исключения для потока управления.

Если вы обнаружите, что хотите вырваться из замкнутости, вам, вероятно, сначала следует подумать о том, почему вы хотите это сделать, а не о том, как это сделать. В первую очередь следует рассмотреть возможность замены рассматриваемого замыкания одной из (концептуальных) функций высшего порядка Groovy. Следующий пример:

for ( i in 1..10) { if (i < 5) println i; else return}

становится

(1..10).each{if (it < 5) println it}

становится

(1..10).findAll{it < 5}.each{println it} 

, что также способствует ясности.Он гораздо лучше заявляет о намерениях вашего кода.

Потенциальный недостаток показанных примеров состоит в том, что итерация останавливается только в первом примере. Если у вас есть соображения по поводу производительности, вы можете сразу же остановить его.

Однако для большинства случаев использования, связанных с итерациями, вы обычно можете прибегнуть к одному из методов Groovy find, grep, collect, inject и т. Д. Обычно они берут некоторую «конфигурацию», а затем «знают», как выполнить итерацию за вас, так что вы действительно можете избежать императивного цикла, где это возможно.

10
ответ дан 23 November 2019 в 23:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: