Влияние контрактов Kotlin на другое свойство / функцию - PullRequest
0 голосов
/ 18 марта 2019

Возможно ли с Kotlin Contract сделать эту смарт-трансляцию возможной?
Предполагая, что у меня есть следующая функция расширения для карт

fun<K, V> Maps<K, V>.contains(k : K) : Boolean
{
    //simply check for map containing key
}

И после вызова этого метода я хочу, чтобы этот вызов был преобразован в NotNull:

if(map.contains(key))
{
    map.get(key).callAnyMethod()
    //smartcast get(key) to not null
}

1 Ответ

0 голосов
/ 18 марта 2019

Вы не можете сделать это с контрактами в настоящее время (примечание: я был бы удивлен, если бы они покрывали этот случай). Однако в стандартной библиотеке вы рассмотрели несколько способов!

Предполагая, что у вас есть Map, вы можете позвонить на него containsKey (сортируйте, как сейчас). Зная, что «A» в этом случае не равно нулю, мы можем использовать .getValue("A"), чтобы получить ненулевое значение с карты.

val map = mapOf("A" to "B")
if(map.containsKey("A")) {
    println(map.getValue("A").toLowerCase())
}

Обратите внимание, что если вы позвоните .getValue() со значением, которое на самом деле равно нулю, вы получите NoSuchElementException.

Еще один идиоматический способ сделать это - использовать let, который будет выполнять блок, только если значение не равно нулю:

map["A"]?.let { 
    println(it.toLowerCase())
}

В этом примере мы могли бы заменить ["A"] на .get("A"), если вы предпочитаете.

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