W Kotlin, [email protected]
syntax służy do określania, która funkcja spośród kilku zagnieżdżonych, z której zwraca to polecenie.
Działa z literałami funkcji (lambdas) i funkcjami lokalnymi. Instrukcje niepolecane return
powracają z najbliższego (to jest najgłębszego) kodu zawierającego fun
(ignorując lambdas). Rozważmy tę funkcję:
fun foo(ints: List<Int>) {
ints.forEach {
if (it == 0) return
print(it)
}
}
Tutaj return
zakończy wykonanie foo
, nie tylko lambda.
Ale jeśli chcesz, aby powrócić z jakiejkolwiek innej funkcji (lambda lub zewnętrznej fun
) trzeba określić go jako etykieta na return
stwierdzeniem:
fun foo(ints: List<Int>) {
ints.forEach {
if (it == 0) [email protected] // implicit label for lambda passed to forEach
print(it)
}
}
fun foo(ints: List<Int>): List<String> {
val result = ints.map [email protected]{
if (it == 0) [email protected] "zero" // return at named label
if (it == -1) return emptyList() // return at foo
"number $it" // expression returned from lambda
}
return result
}
foo(listOf(1, -1, 1)) // []
foo(listOf(1, 0, 1)) // ["number 1", "zero", "number 1"]
Non-local return (tj. Powrót z zewnętrznych funkcji) z lambda jest obsługiwany tylko dla funkcji local i inline, ponieważ jeśli ambda nie jest wstawiona (lub funkcja jest umieszczona wewnątrz obiektu), nie można zagwarantować, że zostanie wywołana tylko wewnątrz funkcji otaczającej (np. może być przechowywany w zmiennej i wywoływany później), a zwrot nielokalny nie ma sensu w tym przypadku.
Istnieje też podobna składnia qualified this
, która jest wykorzystywana do odwołania do zewnętrznych odbiorników zakresów: [email protected]
.
To jest adnotacja https://en.wikipedia.org/wiki/Java_annotation. – kichik
To jest oczywiście, ale adnotacje w java są umieszczane przed metodą lub klasą nie "inline" wewnątrz bloku kodu –
Możesz dodawać adnotacje więcej niż tylko metodę lub klasę w Javie - http://stackoverflow.com/questions/24229445/how-to-annotate-a-code-block-in-java – kichik