Безопасный вызов последнего свойства в цепочке переменных - PullRequest
0 голосов
/ 24 февраля 2019

Чтение о Нулевой безопасности в Kotlin и мне любопытно, почему цепочки переменных, такие как bob?.department?.head?.name, никогда не заканчиваются на ? - чтобы проверить, не является ли последнее доступное свойство не нулевым (в данном случае name).

Я делаю Типы Nullable для Kotlin Koans и мне любопытно, почему ответ не может быть:

fun sendMessageToClient(client: Client?, message: String?, mailer: Mailer){
    val email = client?.personalInfo?.email?
    if (message != null){ mailer.sendMessage(email, message) }
}

class Client (val personalInfo: PersonalInfo?)
class PersonalInfo (val email: String?)
interface Mailer {
    fun sendMessage(email: String, message: String)
}

вместо (ответ):

fun sendMessageToClient(client: Client?, message: String?, mailer: Mailer){
    val email = client?.personalInfo?.email
    if (message != null && email != null){ mailer.sendMessage(email, message) }
}

class Client (val personalInfo: PersonalInfo?)
class PersonalInfo (val email: String?)
interface Mailer {
    fun sendMessage(email: String, message: String)
}

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Значение?может быть немного отличается от того, что вы думаете.Все, что он делает, это перемещается по нулям.

Так что, Боб? .Департамент дает тебе отдел?Если бы вместо этого вы использовали bob.department, вы получили бы ошибку компиляции, потому что отдел обнуляется в bob.

Цепочка не может заканчиваться символом?, Поскольку нет?оператор .Ты можешь использовать ?.или?:

У вас есть 3 варианта:

  1. Сохранить результат цепочки в переменную типа Something?
  2. Завершить цепочку с помощью?:оператор.В этом случае вы должны предоставить альтернативу для случая, когда значение равно нулю (также называемое значением по умолчанию)
  3. Продолжить цепочку с? .Let {}.Код в лямбде будет выполняться только в том случае, если результат цепочки не равен нулю
0 голосов
/ 25 февраля 2019

Вам все равно придется делать, что делать, если электронная почта пуста или не пустаБросить исключение?вернуть?Выполнить блок else?Что?

Два альтернативных способа написания ответа, и которые близки к тому, что вы хотели бы, были бы

client?.personalInfo?.email ?.let { email ->
  if (message != null) { mailer.sendMessage(email, message) }
}

и

val email = client?.personalInfo?.email ?: return
if (message != null) { mailer.sendMessage(email, message) }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...