Котлин + пусть метод + это ключевое слово - PullRequest
1 голос
/ 09 ноября 2019

Venkat в своей книге «Программирование на Kotlin» на странице 237 объясняет разницу между беглыми методами также (), apply (), let () и run ()

Но указанный код не компилируется.

В частности, эти два вызова: компилятор говорит "'this' is not defined in this context"

val result1 = str.let { arg ->
    print(String.format(format, "let", arg, this, result))
    result
}
println(String.format("%-10s", result1))

val result2 = str.also { arg ->
    print(String.format(format, "also", arg, this, result))
    result
}
println(String.format("%-10s", result2))

Так что мой вопрос: поддерживает ли let () и также () ключевое слово this.

1 Ответ

4 голосов
/ 09 ноября 2019

Если вы посмотрите на исходную функцию let:

public inline fun <T, R> T.let(block: (T) -> R): R {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    return block(this)
}

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

Если в let вы вызываете this, это будет ссылаться на область действия класса, в который вызывается функция:

class Clazz {

  fun function() {
     something.let {
        // `this` refers to class scope, so `this` is a Clazz
        // `it` refers to the something itself
     }
  }
}

То же самое для also.

Разница между also и let в том, как они возвращаются. let возвращает то, что возвращает блок, и also возвращает сам объект, а также let использует лямбду в качестве аргумента, поэтому параметр доступен с использованием it, тогда как also использует лямбда-приемник, что делает параметр доступным как this.

TL; DR

В let ключевое слово this будет ссылаться на класс itв. Так что, если он не в классе, это ни к чему не приведет.

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