Если вы посмотрите на исходную функцию 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в. Так что, если он не в классе, это ни к чему не приведет.