Nano Hash - криптовалюты, майнинг, программирование

Необнуляемое значение, необходимое для вызова функции 'component1()' инициализатора объявления деструктурирования

Можно ли сделать следующий код для компиляции в Kotlin?

val variable: String? = "string"

val (a, b) = variable?.run {
    1 to 2
}  

Ответы:


1

Компилятор не разрешает деструктурирование, поскольку выражение в правой части имеет тип Pair<Int, Int>?, допускающий значение NULL, и неясно, какие значения должны получить a и b, если variable равно NULL.

Чтобы решить эту проблему, вам нужно получить ненулевое выражение после =.

Существует множество различных способов обработки значений, допускающих значение NULL, и получения ненулевого значения из значения, допускающего значение NULL, см.: Как в Kotlin идиоматично работать с нулевыми значениями, ссылаясь на них или преобразовывая их

Например, если вы хотите предоставить резервные значения для a и b, используйте оператор ?: следующим образом:

val (a, b) = variable?.run {
    1 to 2
} ?: (0 to 0)

Альтернативой, например, было бы сначала проверить variable на null:

val (a, b) = checkNotNull(variable) { "variable should never be null" }.run {
    1 to 2
}
04.03.2020
  • Я думаю, что a и b должны быть равны нулю, если variable равно нулю, или я что-то упускаю? variable может быть нулевым, и в этом случае резервные значения должны быть нулевыми. 04.03.2020
  • Я добавил ?: (null to null) в конце, и это сработало, но я считаю, что это можно сделать автоматически. 04.03.2020
  • На самом деле вам нужно null as Int? to null as Int?, если вы хотите, чтобы a и b были Int?, а не Any?. 04.03.2020

  • 2

    Null не имеет деструктурирующих объявлений. Если вы хотите, чтобы значение null деструктурировалось как пара нулей, вы можете добавить следующие расширения:

    operator fun <T> Pair<T, *>?.component1() = this?.component1()
    operator fun <T> Pair<*, T>?.component2() = this?.component2()
    

    В противном случае, как показывает другой ответ, вам необходимо указать значение по умолчанию с помощью оператора Элвиса.

    Он не автоматический, потому что не знает, чего вы хотите. В зависимости от того, что вы с ним делаете, 0 to 0 может быть наиболее подходящим, или, может быть, -1 to -1 или 0 to null или null to null.

    04.03.2020
  • Существует оператор elvis, если мы хотим определить значение по умолчанию, отличное от нуля. Думаю, было бы разумно вернуть null to null. 05.03.2020
  • Вы можете открыть вопрос на YouTrack, чтобы предложить его. Это не часть stdlib. Я полагаю, что если бы было значение по умолчанию, оно должно было бы быть null to null, чтобы оно работало для любых типов. 05.03.2020

  • 3

    Вопрос в том, что вы хотите сделать, если ваша переменная равна нулю? Если вы хотите создать исключение, используйте require или check, как предложил @hotkey.

    Однако у меня есть случай, когда я просто хочу вернуться, если значение равно null. Поэтому я написал себе небольшую вспомогательную функцию, которая позволяет это сделать:

    private inline fun <T> T?.exitIfNull(exitBlock: () -> Nothing): T {
        if (this == null)
            exitBlock()
        else
            return this
    }
    

    Вы можете вызвать эту функцию следующим образом:

    val (a, b) = variable?.run {
        1 to 2
    }.exitIfNull {
        return
    }
    

    Приятное небольшое использование ключевого слова Nothing в Kotlin, которое я лично нахожу весьма захватывающим.

    06.03.2021
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..