Понимание необходимости Kotlin пусть - PullRequest
0 голосов
/ 26 января 2019

Я пытаюсь понять, зачем пусть нужен. В приведенном ниже примере у меня есть класс Test с функцией giveMeFive:

public class Test() {
    fun giveMeFive(): Int {
        return 5
    }
}

Учитывая следующий код:

var test: Test? = Test()

var x: Int? = test?.giveMeFive()

test = null

x = test?.giveMeFive()
x = test?.let {it.giveMeFive()}

x получает значение 5, а после того, как для test задано значение null, вызов любого из следующих операторов возвращает значение null для x. Учитывая, что вызов метода по нулевой ссылке пропускает вызов и устанавливает значение x равным нулю, зачем мне когда-либо использовать let? Есть ли случаи, когда просто? не сработает и пусть требуется?

Далее, если вызываемая функция ничего не возвращает, тогда? пропущу звонок, а мне не нужен? .let там тоже.

Ответы [ 2 ]

0 голосов
/ 27 января 2019

let ()

fun <T, R> T.let(f: (T) -> R): R = f(this)

let () - это функция видимости: используйте ее всякий раз, когда вы хотите определить переменную для конкретной области вашего кода, но не за ее пределами.Чрезвычайно полезно сохранять ваш код хорошо автономным, чтобы у вас не было «утечек» переменных: они доступны после точки, в которой они должны быть.

DbConnection.getConnection().let { connection ->
}

// соединение больше не видноздесь

let () также может использоваться как альтернатива тестированию на нуль:

val map : Map<String, Config> = ...
val config = map[key]
// config is a "Config?"
config?.let {
// This whole block will not be executed if "config" is null.
// Additionally, "it" has now been cast to a "Config" (no 
question mark)
}

A simple go to chart when to use when.

0 голосов
/ 27 января 2019

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

Допустим, вместо определения вашей функции было следующее:

// Not defined inside the Test class
fun giveMeFive(t: Test) {
    return 5
}

Теперь, если у вас есть обнуляемый Test и вы хотите вызвать эту функцию в цепочке, вы должны использовать let:

val x = test?.let { giveMeFive(it) }
...