что значит "лямбда @" в котлине - PullRequest
0 голосов
/ 06 марта 2019

Оттуда: https://kotlinlang.org/docs/reference/this-expressions.html#qualified

у нас есть такой код:

val funLit = lambda@ fun String.() {}

Беги туда https://pl.kotl.in/Syah1jaIN он компилируется и вызывается без ошибки

Я думал, что "лямбда @" была аннотацией, но документация здесь: https://kotlinlang.org/docs/reference/annotations.html относится к синтаксису вроде «@word», а не «word @».

Ответы [ 3 ]

3 голосов
/ 06 марта 2019

Это действительно метка, и она особенно полезна в этом примере, поскольку она маркирует анонимную функцию. Вы используете ярлык для уточняющих ссылок (например, this).

В следующем примере лямбда-код определяет внутренний метод nested, который может захотеть получить доступ к this из funLit. Поскольку он анонимный, нам нужно его пометить, lambda - произвольный идентификатор.

fun main() {
    val funLit = lambda@ fun String.() {
        println("this:        " + this)
        println("this@lambda: " + this@lambda)

        fun String.nested() {
            println("this        in String.nested(): " + this)
            println("this@nested in String.nested(): " + this@nested)
            println("this@lambda in String.nested(): " + this@lambda)
        }

        "nested".nested()
    }
    "funLit".funLit()
}

Запуск этого файла очень ясно показывает, на что this ссылается квалификатор.

this:        funLit
this@lambda: funLit
this        in String.nested(): nested
this@nested in String.nested(): nested
this@lambda in String.nested(): funLit

Вот ссылка на игровую площадку: https://pl.kotl.in/SJrlUs6LE

2 голосов
/ 06 марта 2019

Они называются метками .Рассмотрим этот пример.with принимает приемник (StringBuilder здесь) и лямбду с приемником (объяснено здесь ).Внутри этого второго аргумента лямбда-выражение this относится к StringBuilder.Так что если вы print(this) это то же самое, что и квалифицированный print(this@with).Квалифицированный this имеет смысл, когда вы хотите получить доступ к внешним ссылкам this, например, из включающего экземпляра Outer:

class Outer{
    fun someFunction() = with(StringBuilder()){
        println(this)
        println(this@with) //same as this
        println(this@Outer)
    }
}

Также можно установить пользовательские метки:

fun someFunction() = with(StringBuilder()) customLabel@{
    println(this@customLabel) //same as this
}
1 голос
/ 06 марта 2019

Это не аннотация, а метка: https://kotlinlang.org/docs/reference/returns.html#break-and-continue-labels

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...