Kotlin връщане, почивка, продължаване Ключови думи

1. Общ преглед

В този урок ще обсъдим използването на структурни изрази за скок в Kotlin.

Просто казано, Kotlin има три структурни израза за скок: връщане, прекъсване, продължаване. В следващите раздели ще разгледаме техните функции със и без етикет.

2. Етикети в Kotlin

Всички изрази в Kotlin могат да бъдат маркирани с етикет.

Ние създаваме етикет, като използваме идентификатор, последван от знака „ @“ . Например [имейл защитен] , [имейл защитен] са валидни етикети.

За да маркираме израз, ние просто добавяме етикета пред него:

[email protected] for (i in 1..10) { // some code }

3. Break изявление

Без етикет, прекъсването прекратява най-близкия заграждащ контур.

Нека да разгледаме един пример:

@Test fun givenLoop_whenBreak_thenComplete() { var value = "" for (i in "hello_world") { if (i == '_') break value += i.toString() } assertEquals("hello", value) }

Като алтернатива можем да използваме break с етикет, който прекратява цикъла, маркиран с този етикет:

@Test fun givenLoop_whenBreakWithLabel_thenComplete() { var value = "" [email protected] for (i in 'a'..'d') { for (j in 1..3) { value += "" + i + j if (i == 'b' && j == 1) [email protected]_loop } } assertEquals("a1a2a3b1", value) }

В този случай външният цикъл се прекратява, когато променливите i и j съответно са „b“ и „1“.

4. Продължете изявлението

След това нека разгледаме ключовата дума continue , която също можем да използваме със или без етикет.

Без етикет, продължението ще продължи към следващата итерация на заграждащия цикъл:

@Test fun givenLoop_whenContinue_thenComplete() { var result = "" for (i in "hello_world") { if (i == '_') continue result += i } assertEquals("helloworld", result) }

От друга страна, когато използваме продължение с етикет, маркиращ цикъл, той ще продължи към следващата итерация на този цикъл:

@Test fun givenLoop_whenContinueWithLabel_thenComplete() { var result = "" [email protected] for (i in 'a'..'c') { for (j in 1..3) { if (i == 'b') [email protected]_loop result += "" + i + j } } assertEquals("a1a2a3c1c2c3", result) }

В този пример използвахме продължаване, за да пропуснем една итерация на цикъла с етикет external_loop.

5. Отчет за връщане

Без етикет той се връща към най-близката заграждаща функция или анонимна функция:

@Test fun givenLambda_whenReturn_thenComplete() { var result = returnInLambda(); assertEquals("hello", result) } private fun returnInLambda(): String { var result = "" "hello_world".forEach { if (it == '_') return result result += it.toString() } //this line won't be reached return result; }

Връщането е полезно и когато искаме да приложим логика за продължаване на анонимни функции:

@Test fun givenAnonymousFunction_return_thenComplete() { var result = "" "hello_world".forEach(fun(element) { if (element == '_') return result += element.toString() }) assertEquals("helloworld", result) }

В този пример операторът return ще се върне към повикващия анонимното забавление, т.е. цикъла forEach .

В случай на ламбда израз, можем също да използваме return с етикет, за да постигнем подобен резултат:

@Test fun givenLambda_whenReturnWithExplicitLabel_thenComplete() { var result = "" "hello_world".forEach [email protected]{ if (it == '_') { [email protected] } result += it.toString() } assertEquals("helloworld", result) }

Като алтернатива можем да се върнем и с неявен етикет :

@Test fun givenLambda_whenReturnWithImplicitLabel_thenComplete() { var result = "" "hello_world".forEach { if (it == '_') { // local return to the caller of the lambda, i.e. the forEach loop [email protected] } result += it.toString() } assertEquals("helloworld", result) }

В горния пример операторът return също ще се върне към повикващия ламбда - цикъла forEach .

И накрая, return може да се използва с етикет, за да се приложи логика на прекъсване към ламбда изрази чрез връщане към етикет отвън :

@Test fun givenAnonymousFunction_returnToLabel_thenComplete() { var result = "" run [email protected]{ "hello_world".forEach { if (it == '_') [email protected] result += it.toString() } } assertEquals("hello", result) }

6. Заключение

В тази статия сме преминали през случаите на използване на return, break, continue в Kotlin.

Примерният код може да бъде намерен в GitHub.