Spec-Zone.ru › Kotlin 1.7

Что нового в Kotlin 1.7.20

Дата выхода: 29 сентября 2022 года

Вышел релиз Kotlin 1.7.20! Вот некоторые ключевые моменты этого релиза:

  • Новый компилятор Kotlin K2 поддерживает all-open, SAM с получателем, Lombok и другие плагины компилятора

  • Мы представили предварительный просмотр оператора ..< для создания открытых диапазонов

  • Новый менеджер памяти Kotlin/Native теперь включен по умолчанию

  • Мы представили новую экспериментальную функцию для JVM: встроенные классы с универсальным базовым типом

Также вы можете найти краткий обзор изменений в этом видео:

Поддержка плагинов компилятора Kotlin K2

Команда Kotlin продолжает стабилизировать компилятор K2. K2 все еще находится в стадии Альфа (как было объявлено в релизе Kotlin 1.7.0), но теперь он поддерживает несколько плагинов компилятора. Следите за этой задачей в YouTrack, чтобы получать обновления от команды Kotlin о новом компиляторе.

Начиная с релиза 1.7.20, компилятор Kotlin K2 поддерживает следующие плагины:

  • all-open

  • no-arg

  • SAM с получателем

  • Lombok

  • AtomicFU

  • jvm-abi-gen

Альфа-версия нового компилятора K2 работает только с проектами JVM. Она не поддерживает Kotlin/JS, Kotlin/Native или другие кроссплатформенные проекты.

Узнайте больше о новом компиляторе и его преимуществах в следующих видео:

  • Путь к новому компилятору Kotlin

  • Компилятор K2: общий вид

Как включить компилятор Kotlin K2

Чтобы включить компилятор Kotlin K2 и протестировать его, используйте следующий параметр компилятора:

-Xuse-k2

Вы можете проверить прирост производительности в своих проектах JVM и сравнить его с результатами старого компилятора.

Оставьте свой отзыв о новом компиляторе K2

Мы очень ценим ваш отзыв в любой форме:

  • Направьте свой отзыв разработчикам K2 в Kotlin Slack: получите приглашение и присоединитесь к каналу #k2-early-adopters.

  • Сообщите о любых проблемах, с которыми вы столкнулись при использовании нового компилятора K2, в нашей системе отслеживания ошибок: система отслеживания ошибок.

  • Включите параметр отправки статистических данных использования, чтобы разрешить JetBrains собирать анонимные данные об использовании K2.

Язык

Kotlin 1.7.20 вводит предварительные версии новых функций языка, а также накладывает ограничения на выведение типов для билдеров:

  • Предварительный просмотр оператора ..< для создания открытых диапазонов

  • Новые объявления data object

  • Ограничения вывода типов для билдеров

Предварительный просмотр оператора ..< для создания открытых диапазонов

Новый оператор — Экспериментальный, и его поддержка в IDE ограничена.

Этот релиз вводит новый ..< оператор. Kotlin имеет .. оператор для выражения диапазона значений. Новый ..< оператор действует как функция until и помогает определять открытый диапазон.

Наши исследования показывают, что этот новый оператор лучше выражает открытые диапазоны и четко указывает, что верхняя граница не включена.

Вот пример использования ..< оператора в when выражении:

when (value) {
    in 0.0..<0.25 -> // first quarter
    in 0.25..<0.5 -> // second quarter
    in 0.5..<0.75 -> // third quarter
    in 0.75..1.0 ->  // last quarter  <- note closed range here
}

Изменения в API стандартной библиотеки

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

Новый интерфейс OpenEndRange

Новый интерфейс для представления открытых диапазонов очень похож на существующий интерфейс ClosedRange<T>.

interface OpenEndRange<T : Comparable<T>> {
    // lower bound
    val start: T
    // upper bound, not included in the range
    val endExclusive: T
    operator fun contains(value: T): Boolean = value >= start && value < endExclusive
    fun isEmpty(): Boolean = start >= endExclusive
}
Реализация OpenEndRange в существующих итерируемых диапазонах

В настоящее время, когда разработчики нуждаются в диапазоне с исключенной верхней границей, они используют функцию until, чтобы эффективно создать замкнутый итерируемый диапазон с теми же значениями. Чтобы сделать такие диапазоны приемлемыми в новой API, которая принимает OpenEndRange<T>, мы хотим реализовать этот интерфейс в существующих итерируемых диапазонах: IntRange, LongRange, CharRange, UIntRange, и ULongRange. Таким образом, они будут одновременно реализовывать как ClosedRange<T>, так и OpenEndRange<T> интерфейсы.

class IntRange : IntProgression(...), ClosedRange<Int>, OpenEndRange<Int> {
    override val start: Int
    override val endInclusive: Int
    override val endExclusive: Int
}
Операторы rangeUntil для стандартных типов

Будут предоставлены rangeUntil операторы для тех же типов и комбинаций, которые в настоящее время определяются rangeTo оператором. Мы предоставляем их как расширяющие функции в целях прототипирования, но для согласованности планируем сделать их членами позже, перед стабилизацией API открытых диапазонов.

Как включить оператор ..<

Чтобы использовать ..< оператор или реализовать соглашение об этом операторе для собственных типов, включите -language-version 1.8 опцию компилятора.

Новые элементы API, введённые для поддержки открытых диапазонов стандартных типов, требуют опционального включения, как обычно для экспериментального API стандартной библиотеки: @OptIn(ExperimentalStdlibApi::class). В качестве альтернативы, вы можете использовать -opt-in=kotlin.ExperimentalStdlibApi опцию компилятора.

Узнайте больше о новом операторе в этом документе KEEP.

Улучшенные строковые представления для одиночных объектов и иерархий sealed классов с data object

Data object — Экспериментальный тип, и его поддержка в IDE на данный момент ограничена.

В этом релизе представлен новый тип объявления object, который вы можете использовать: data object. Data object концептуально идентичен обычному object объявлению, но поставляется со чистым toString представлением по умолчанию.

package org.example
object MyObject
data object MyDataObject

fun main() {
    println(MyObject) // org.example.MyObject@1f32e575
    println(MyDataObject) // MyDataObject
}

Это делает объявления data object идеальными для иерархий sealed классов, где вы можете использовать их вместе с объявлениями data class. В этом фрагменте объявление EndOfFile как data object вместо простого object означает, что оно получит красивое toString без необходимости ручного переопределения, сохраняя симметрию с сопроводительными data class определениями:

sealed class ReadResult {
    data class Number(val value: Int) : ReadResult()
    data class Text(val value: String) : ReadResult()
    data object EndOfFile : ReadResult()
}

fun main() {
    println(ReadResult.Number(1)) // Number(value=1)
    println(ReadResult.Text("Foo")) // Text(value=Foo)
    println(ReadResult.EndOfFile) // EndOfFile
}

Как включить data object

Чтобы использовать объявления data object в вашем коде, включите -language-version 1.8 опцию компилятора. В проекте Gradle вы можете сделать это, добавив следующее в ваш build.gradle(.kts).

tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile>().configureEach {
    // . . .
    kotlinOptions.languageVersion = "1.8"
}
compileKotlin {
    // . . .
    kotlinOptions.languageVersion = '1.8'
}

Узнайте больше о data object и поделитесь своими отзывами об их реализации в соответствующем документе KEEP.

Новые ограничения вывода типов для билдеров

Kotlin 1.7.20 накладывает некоторые существенные ограничения на использование вывода типов для билдеров, которые могут повлиять на ваш код. Эти ограничения относятся к коду, содержащему лямбда-функции билдера, где невозможно вывести параметр без анализа самой лямбды. Параметр используется как аргумент. Теперь компилятор всегда будет отображать ошибку для такого кода и попросит указать тип явно.

Это изменение, вносящее несовместимость, но наши исследования показывают, что такие случаи очень редки, и ограничения не должны повлиять на ваш код. Если же они повлияют, рассмотрите следующие случаи:

  • Вывод типов для билдера с расширением, скрывающим члены.

    Если ваш код содержит функцию-расширение с тем же именем, которая будет использована во время вывода типов для билдера, компилятор отобразит ошибку:

    class Data {
        fun doSmth() {} // 1
    }
    
    fun <T> T.doSmth() {} // 2
    
    fun test() {
        buildList {
            this.add(Data())
            this.get(0).doSmth() // Resolves to 2 and leads to error
        }
    }
    

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

    class Data {
        fun doSmth() {} // 1
    }
    
    fun <T> T.doSmth() {} // 2
    
    fun test() {
        buildList<Data> { // Type argument!
            this.add(Data())
            this.get(0).doSmth() // resolves to 1
        }
    }
    
  • Вывод типов для билдера с несколькими лямбдами, и типы аргументов не указаны явно.

    Если есть два или более блоков лямбды в выводе типов для билдера, они влияют на тип. Чтобы предотвратить ошибку, компилятор требует указать тип:

    fun <T: Any> buildList(
        first: MutableList<T>.() -> Unit, 
        second: MutableList<T>.() -> Unit
    ): List<T> {
        val list = mutableListOf<T>()
        list.first()
        list.second()
        return list 
    }
    
    fun main() {
        buildList(
            first = { // this: MutableList<String>
                add("")
            },
            second = { // this: MutableList<Int> 
                val i: Int = get(0)
                println(i)
            }
        )
    }
    

    Чтобы исправить ошибку, необходимо явно указать тип и исправить несоответствие типов:

    fun main() {
        buildList<Int>(
            first = { // this: MutableList<Int>
                add(0)
            },
            second = { // this: MutableList<Int>
                val i: Int = get(0)
                println(i)
            }
        )
    }
    

Если вы не нашли свой случай в вышеперечисленных, сообщите об этом нашей команде.

См. эту задачу YouTrack для получения дополнительной информации об обновлении вывода типов для билдеров.

Kotlin/JVM

Kotlin 1.7.20 вводит обобщённые inline-классы, добавляет больше оптимизаций байткода для делегированных свойств и поддерживает IR в задаче генерации псевдокода kapt, что позволяет использовать все новейшие возможности Kotlin с kapt:

  • Обобщённые inline-классы

  • Более оптимизированные случаи делегированных свойств

  • Поддержка JVM IR-бекенда в задаче генерации псевдокода kapt

Обобщённые inline-классы

Обобщённые inline-классы — это экспериментальная функция. Она может быть удалена или изменена в любое время. Необходима опциональная включение (см. подробности ниже), и вы должны использовать её только для оценочных целей. Мы будем рады вашим отзывам об этом на YouTrack.

Kotlin 1.7.20 позволяет использовать в качестве базового типа JVM inline-класса параметр типа. Компилятор отображает его на Any? или, в общем случае, на верхнюю границу параметра типа.

Рассмотрим следующий пример:

@JvmInline
value class UserId<T>(val value: T)

fun compute(s: UserId<String>) {} // compiler generates fun compute-<hashcode>(s: Any?)

Функция принимает inline-класс в качестве параметра. Параметр отображается на верхнюю границу, а не на аргумент типа.

Чтобы включить эту функцию, используйте опцию компилятора -language-version 1.8.

Мы будем рады вашим отзывам об этой функции на YouTrack.

Более оптимизированные случаи делегированных свойств

В Kotlin 1.6.0 мы оптимизировали случай делегирования свойству, исключив поле $delegate и сгенерировав непосредственный доступ к целевому свойству. В 1.7.20 мы реализовали эту оптимизацию для большего количества случаев. Поле $delegate теперь будет опущено, если делегат является:

  • Именованным объектом:

    object NamedObject {
        operator fun getValue(thisRef: Any?, property: KProperty<*>): String = ...
    }
    
    val s: String by NamedObject
    
  • Конечным val свойством с поддерживающим полем и стандартным методом получения в том же модуле:

    val impl: ReadOnlyProperty<Any?, String> = ...
    
    class A {
        val s: String by impl
    }
    
  • Константным выражением, элементом перечисления, this, или null. Вот пример this.

    class A {
        operator fun getValue(thisRef: Any?, property: KProperty<*>) ...
    
        val s by this
    }
    

Узнайте больше о делегированных свойствах.

Мы будем рады вашим отзывам об этой функции на YouTrack.

Поддержка JVM IR-бекенда в задаче генерации псевдокода kapt

Поддержка JVM IR-бекенда в задаче генерации псевдокода kapt — это экспериментальная функция. Она может быть изменена в любое время. Необходима опциональная включение (см. подробности ниже), и вы должны использовать её только для оценочных целей.

До версии 1.7.20 задача генерации псевдокода kapt использовала старый бекенд, и повторяющиеся аннотации не работали с kapt. С Kotlin 1.7.20 мы добавили поддержку JVM IR-бекенда в задаче генерации псевдокода kapt. Это позволяет использовать все новейшие функции Kotlin с kapt, включая повторяющиеся аннотации.

Чтобы использовать IR-бекенд в kapt, добавьте следующую опцию в ваш файл gradle.properties.

kapt.use.jvm.ir=true

Мы будем рады вашим отзывам об этой функции на YouTrack.

Kotlin/Native

Kotlin 1.7.20 поставляется с новым менеджером памяти Kotlin/Native, включённым по умолчанию, и предоставляет возможность настроить файл Info.plist:

  • Новый менеджер памяти по умолчанию

  • Настройка файла Info.plist

Новый менеджер памяти Kotlin/Native по умолчанию

Этот релиз добавляет дальнейшую стабильность и улучшения производительности новому менеджеру памяти, что позволяет нам перевести его в состояние Beta.

Предыдущий менеджер памяти усложнял написание конкурентного и асинхронного кода, включая проблемы с реализацией библиотеки kotlinx.coroutines. Это препятствовало принятию Kotlin Multiplatform Mobile, поскольку ограничения по конкурентности создавали проблемы с совместным использованием Kotlin-кода между платформами iOS и Android. Новый менеджер памяти наконец открывает путь к переводу Kotlin Multiplatform Mobile в состояние Beta.

Новый менеджер памяти также поддерживает кэш компилятора, что делает время компиляции сопоставимым с предыдущими релизами. Более подробную информацию о преимуществах нового менеджера памяти см. в нашем исходном посте в блоге для предварительной версии. Более подробные технические детали можно найти в документации.

Настройка и настройка

Начиная с Kotlin 1.7.20, новый менеджер памяти является по умолчанию. Больше дополнительных настроек не требуется.

Если вы уже включили его вручную, вы можете удалить опцию kotlin.native.binary.memoryModel=experimental из своего файла gradle.properties или binaryOptions["memoryModel"] = "experimental" из файла build.gradle(.kts).

При необходимости вы можете вернуться к менеджеру памяти предыдущего поколения с помощью опции kotlin.native.binary.memoryModel=strict в вашем gradle.properties. Однако поддержка кэша компилятора для менеджера памяти предыдущего поколения больше недоступна, поэтому время компиляции может ухудшиться.

Замораживание

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

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

  • Добавьте аннотацию к использованию устаревшего API с помощью @OptIn(FreezingIsDeprecated::class).

  • Примените languageSettings.optIn("kotlin.native.FreezingIsDeprecated") ко всем наборам Kotlin-исходников в Gradle.

  • Передайте флаг компилятора -opt-in=kotlin.native.FreezingIsDeprecated.

Вызов Kotlin-подвешенных функций из Swift/Objective-C

Новый менеджер памяти по-прежнему ограничивает вызов Kotlin-функций suspend из Swift и Objective-C с потоков, отличных от основного, но вы можете снять это ограничение с помощью новой опции Gradle.

Это ограничение было изначально введено в менеджере памяти предыдущего поколения из-за случаев, когда код отправлял продолжение на возобновление на исходном потоке. Если у этого потока не было поддерживаемой очереди событий, задача никогда не выполнялась, и сопрограмма никогда не возобновлялась.

В некоторых случаях это ограничение больше не требуется, но проверка всех необходимых условий не может быть легко реализована. Из-за этого мы решили сохранить его в новом менеджере памяти, одновременно представив вам опцию его отключения. Для этого добавьте следующую опцию в свой файл gradle.properties:

kotlin.native.binary.objcExportSuspendFunctionLaunchThreadRestriction=none

Не добавляйте эту опцию, если вы используете версию native-mt kotlinx.coroutines или другие библиотеки, которые используют тот же подход "передачи на исходный поток".

Команда Kotlin выражает огромную благодарность Ахмеду Эл-Хелву за реализацию этой опции.

Оставьте свой отзыв

Это существенное изменение нашей экосистемы. Мы ценим ваш отзыв, чтобы сделать ее еще лучше.

Попробуйте новый менеджер памяти в своих проектах и поделитесь отзывом в нашем трекере задач YouTrack.

Настройка файла Info.plist

При создании фреймворка компилятор Kotlin/Native генерирует файл информации property list — Info.plist. Раньше настройка его содержимого была сложной задачей. С Kotlin 1.7.20 вы можете напрямую задавать следующие свойства:

Свойство

Двоичный вариант

CFBundleIdentifier

bundleId

CFBundleShortVersionString

bundleShortVersionString

CFBundleVersion

bundleVersion

Для этого используйте соответствующий двоичный вариант. Передайте флаг компилятора Xbinary=$option=$value или задайте binaryOption(option, value) DSL Gradle для необходимого фреймворка.

Команда Kotlin выражает большую признательность Мадсу Эгеру за реализацию этой функции.

Kotlin/JS

Kotlin/JS получило некоторые улучшения, которые повышают удобство разработки и ускоряют производительность:

  • Генерация Klib стала быстрее как в инкрементных, так и в чистых сборках благодаря улучшениям эффективности загрузки зависимостей.

  • Инкрементная компиляция для бинарных файлов разработки была переработана, что привело к значительным улучшениям в сценариях чистых сборок, более быстрым инкрементным сборкам и исправлениям стабильности.

  • Мы улучшили генерацию .d.ts для вложенных объектов, sealed-классов и необязательных параметров в конструкторах.

Gradle

Обновления плагина Kotlin Gradle сосредоточены на совместимости с новыми функциями Gradle и последними версиями Gradle.

Kotlin 1.7.20 содержит изменения для поддержки Gradle 7.1. Устаревшие методы и свойства были удалены или заменены, что уменьшает количество предупреждений об устаревании, производимых плагином Kotlin Gradle, и открывает путь к будущей поддержке Gradle 8.0.

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

Конфигурация целевой платформы

  • org.jetbrains.kotlin.gradle.dsl.SingleTargetExtension теперь имеет параметр типа, SingleTargetExtension<T : KotlinTarget>.

  • Конвенция kotlin.targets.fromPreset() устарела. Вместо нее вы по-прежнему можете использовать kotlin.targets { fromPreset() }, но мы рекомендуем использовать более специализированные способы создания целей.

  • Автоматически генерируемые Gradle-акцессоры к целевым платформам больше не доступны внутри блока kotlin.targets { }. Пожалуйста, используйте метод findByName("targetName") вместо этого.

    Обратите внимание, что такие акцессоры по-прежнему доступны в случае kotlin.targets, например, kotlin.targets.linuxX64.

Настройка каталогов исходных файлов

Плагин Kotlin Gradle теперь добавляет Kotlin SourceDirectorySet как расширение kotlin к группе Java's SourceSet. Это позволяет настраивать каталоги исходных файлов в файле build.gradle.kts аналогично тому, как они настраиваются в Java, Groovy и Scala:

sourceSets {
    main {
        kotlin {
            java.setSrcDirs(listOf("src/java"))
            kotlin.setSrcDirs(listOf("src/kotlin"))
        }
    }
}

Вам больше не нужно использовать устаревшую конвенцию Gradle и указывать каталоги исходных файлов для Kotlin.

Помните, что вы также можете использовать расширение kotlin для доступа к KotlinSourceSet:

kotlin {
    sourceSets {
        main {
        // …
        }
    }
}

Новый метод конфигурации инструментальной цепочки JVM

Этот релиз предоставляет новый метод jvmToolchain() для включения функции инструментальной цепочки JVM. Если вам не нужны дополнительные параметры конфигурации, такие как implementation или vendor, вы можете использовать этот метод из расширения Kotlin:

kotlin {
    jvmToolchain(17)
}

Это упрощает процесс настройки проекта Kotlin без дополнительной конфигурации. До этого релиза вы могли указывать версию JDK только следующим образом:

kotlin {
    jvmToolchain {
        languageVersion.set(JavaLanguageVersion.of(17))
    }
}
END_OF_DOCUMENT_MARKER

Стандартная библиотека

Kotlin 1.7.20 предлагает новые расширяющие функции для класса java.nio.file.Path, позволяющие обходить древовидную структуру файлов:

  • walk() лениво обходит древовидную структуру файлов, корнем которой является указанный путь.

  • fileVisitor() позволяет создать FileVisitor отдельно. FileVisitor определяет действия над директориями и файлами при обходе.

  • visitFileTree(fileVisitor: FileVisitor, ...) потребляет готовое FileVisitor и использует java.nio.file.Files.walkFileTree() под капотом.

  • visitFileTree(..., builderAction: FileVisitorBuilder.() -> Unit) создает FileVisitor с builderAction и вызывает функцию visitFileTree(fileVisitor, ...).

  • FileVisitResult, тип возвращаемого значения FileVisitor, имеет значение по умолчанию CONTINUE, которое продолжает обработку файла.

Новые расширяющие функции для java.nio.file.Path являются Экспериментальными. Они могут быть изменены в любое время. Требуется включение (см. подробности ниже), и вы должны использовать их только для оценочных целей.

Вот что вы можете сделать с помощью этих новых расширяющих функций:

  • Явно создайте FileVisitor и затем используйте:

    val cleanVisitor = fileVisitor {
        onPreVisitDirectory { directory, attributes ->
            // Some logic on visiting directories
            FileVisitResult.CONTINUE
        }
    
        onVisitFile { file, attributes ->
            // Some logic on visiting files
            FileVisitResult.CONTINUE
        }
    }
    
    // Some logic may go here
    
    projectDirectory.visitFileTree(cleanVisitor)
    
  • Создайте FileVisitor с builderAction и используйте её немедленно:

    projectDirectory.visitFileTree {
    // Definition of the builderAction:
        onPreVisitDirectory { directory, attributes ->
            // Some logic on visiting directories
            FileVisitResult.CONTINUE
        }
    
        onVisitFile { file, attributes ->
            // Some logic on visiting files
            FileVisitResult.CONTINUE
        }
    }
    
  • Обходите древовидную структуру файлов, корнем которой является указанный путь, с помощью функции walk().

    @OptIn(kotlin.io.path.ExperimentalPathApi::class)
    fun taverseFileTree() {
        val cleanVisitor = fileVisitor {
            onPreVisitDirectory { directory, _ ->
                if (directory.name == "build") {
                    directory.toFile().deleteRecursively()
                    FileVisitResult.SKIP_SUBTREE
                } else {
                    FileVisitResult.CONTINUE
                }
            }
    
            onVisitFile { file, _ ->
                if (file.extension == "class") {
                    file.deleteExisting()
                }
                FileVisitResult.CONTINUE
            }
        }
    
        val rootDirectory = createTempDirectory("Project")
    
        rootDirectory.resolve("src").let { srcDirectory ->
            srcDirectory.createDirectory()
            srcDirectory.resolve("A.kt").createFile()
            srcDirectory.resolve("A.class").createFile()
        }
    
        rootDirectory.resolve("build").let { buildDirectory ->
            buildDirectory.createDirectory()
            buildDirectory.resolve("Project.jar").createFile()
        }
    
    
    // Use walk function:
        val directoryStructure = rootDirectory.walk(PathWalkOption.INCLUDE_DIRECTORIES)
            .map { it.relativeTo(rootDirectory).toString() }
            .toList().sorted()
        assertPrints(directoryStructure, "[, build, build/Project.jar, src, src/A.class, src/A.kt]")
    
        rootDirectory.visitFileTree(cleanVisitor)
    
        val directoryStructureAfterClean = rootDirectory.walk(PathWalkOption.INCLUDE_DIRECTORIES)
            .map { it.relativeTo(rootDirectory).toString() }
            .toList().sorted()
        assertPrints(directoryStructureAfterClean, "[, src, src/A.kt]")
    //sampleEnd
    }
    

Как обычно для экспериментального API, новые расширения требуют включения: @OptIn(kotlin.io.path.ExperimentalPathApi::class) или @kotlin.io.path.ExperimentalPathApi. В качестве альтернативы, вы можете использовать параметр компилятора: -opt-in=kotlin.io.path.ExperimentalPathApi.

Мы будем рады вашим отзывам о функции walk() и расширяющих функциях обхода в YouTrack.

Обновления документации

С момента предыдущего выпуска документация Kotlin претерпела ряд заметных изменений:

Переработанные и улучшенные страницы

  • Обзор основных типов − узнайте о базовых типах, используемых в Kotlin: числах, булевых значениях, символах, строках, массивах и беззнаковых целых числах.

  • IDE для разработки на Kotlin − ознакомьтесь со списком IDE с официальной поддержкой Kotlin и инструментами с поддержкой сообщества.

Новые статьи в журнале Kotlin Multiplatform

  • Разработка нативных и кроссплатформенных приложений: как выбрать? − ознакомьтесь с нашим обзором и преимуществами кроссплатформенной разработки приложений и нативного подхода.

  • Шесть лучших кроссплатформенных фреймворков для разработки приложений − ознакомьтесь с ключевыми аспектами, которые помогут вам выбрать правильный фреймворк для вашего кроссплатформенного проекта.

Новые и обновленные учебные пособия

  • Начало работы с Kotlin Multiplatform Mobile − узнайте о кроссплатформенной разработке мобильных приложений с помощью Kotlin и создайте приложение, работающее как на Android, так и на iOS.

  • Разработка полнофункционального веб-приложения с помощью Kotlin Multiplatform − создайте приложение, используя Kotlin на всех уровнях, с серверной частью Kotlin/JVM и веб-клиентом Kotlin/JS.

  • Разработка веб-приложения с React и Kotlin/JS − создайте приложение для браузера, изучая DSL Kotlin и функции типичной программы React.

Изменения в документации релиза

Мы больше не предоставляем список рекомендуемых библиотек kotlinx для каждого выпуска. Этот список включал только версии, рекомендованные и протестированные с самим Kotlin. Он не учитывал, что некоторые библиотеки зависят друг от друга и требуют специальной версии kotlinx, которая может отличаться от рекомендуемой версии Kotlin.

Мы работаем над тем, чтобы предоставить информацию о том, как взаимодействуют и зависят друг от друга библиотеки, чтобы было понятно, какую версию библиотеки kotlinx вы должны использовать при обновлении версии Kotlin в своем проекте.

Установка Kotlin 1.7.20

IntelliJ IDEA 213, 221 и 222 автоматически предлагают обновить плагин Kotlin до 1.7.20.

Для Android Studio Dolphin (213), Electric Eel (221) и Flamingo (222) плагин Kotlin 1.7.20 будет включён в будущие обновления Android Studio.

Новая команда компилятора доступна для скачивания на странице релиза GitHub.

Руководство по совместимости для Kotlin 1.7.20

Хотя Kotlin 1.7.20 является инкрементным релизом, нам всё же пришлось внести несовместимые изменения, чтобы ограничить распространение проблем, возникших в Kotlin 1.7.0.

Подробный список таких изменений можно найти в руководстве по совместимости для Kotlin 1.7.20.

Последнее изменение: 29 сентября 2022 г.
Kotlin для соревновательного программирования Что нового в Kotlin 1.7.0

© 2010–2022 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/whatsnew1720.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API