Что по вашему должен выводить код на картинке?
Anonymous Quiz
24%
true
42%
false
33%
Ошибка компиляции
До версии Kotlin 1.6 код бы просто упал с ошибкой компиляции, и ведь логично, созданная лямбда ну никак не похожа на интерфейс Test. Но в последующих обновлениях
Это нужно для удобной работы с Java-функциями, которые в качестве параметров часто принимают такие интерфейсы. Начиная с версии Kotlin 1.6 их стало вызывать также просто, как и родные Kotlin функции.
И никакой особой магии тут нет, компилятор просто генерирует обёртку для лямбды. На картинке представлен примерный вид скомпилированного кода. Тут, как я и говорил, становится очевидно, почему же код вывел false: у нас 2 разных объекта.
Иногда красивые синтаксические конструкции не бесплатны. Будем рассказывать и дальше о таких штуках в этом канале.
Разобрались кто такие языковые сервера, а также: Почему они есть для всех языков программирования, а для Kotlin раньше не было? Что поменялось сейчас, что JetBrains решили выпустить LSP для котлин? Зачем JetBrains официальная поддержка Kotlin в VSCode?
Мы смогли скачать и проверить как работает первая версия LSP, и, спойлер, ошибки подсвечиваются моментально. Я был очень приятно удивлён, и сделал сравнение анализа одного и того же кусочка кода в VSCode и Intellij Idea.
YouTube
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
👀9🔥3❤1👍1 1
Rich Errors: В Kotlin 2.4 появятся Union-типы?
И да, и нет. Для тех, кто не знает, что такое Union-типы, – они позволяют создавать новые типы на основе существующих, подобно логическому оператору ИЛИ.
Например, конструкция userId: String | Int означает, что переменная может принимать значения либо строки, либо числа. Такое существует во многих языках программирования, таких как TypeScript, Python, C# (когда-то в будущем) и др.
В Kotlin же Union-типов не будет скорее всего никогда. Вместо этого предлагается использовать этот же синтаксис для выражения возможных ошибок при выполнении функции (что-то похожее на джавовое throws, но сделанное правильно).
🔴 Обсудим это на стриме уже в субботу в 17:00 МСК. Приходите!
Telegram | YouTube | Twitch
И да, и нет. Для тех, кто не знает, что такое Union-типы, – они позволяют создавать новые типы на основе существующих, подобно логическому оператору ИЛИ.
Например, конструкция userId: String | Int означает, что переменная может принимать значения либо строки, либо числа. Такое существует во многих языках программирования, таких как TypeScript, Python, C# (когда-то в будущем) и др.
В Kotlin же Union-типов не будет скорее всего никогда. Вместо этого предлагается использовать этот же синтаксис для выражения возможных ошибок при выполнении функции (что-то похожее на джавовое throws, но сделанное правильно).
🔴 Обсудим это на стриме уже в субботу в 17:00 МСК. Приходите!
Telegram | YouTube | Twitch
💬 Впервые за долгое время мы наконец смогли собраться в Москве российским Kotlin-сообществом в ФКН ВШЭ.
Хорошая новость в том, что это мероприятие планируется делать серийным и в разных городах (там, где найдём докладчиков). Если хотите встретиться и пообщаться со мной и Эмилем оффлайн, то самое то.
За анонсами можно будет следить в канале Kotlin Russia: https://t.iss.one/kotlin_russia
Хорошая новость в том, что это мероприятие планируется делать серийным и в разных городах (там, где найдём докладчиков). Если хотите встретиться и пообщаться со мной и Эмилем оффлайн, то самое то.
За анонсами можно будет следить в канале Kotlin Russia: https://t.iss.one/kotlin_russia
❤12😭1 1 1
🔴 Сегодняшний стрим переносится на завтра
Возникла куча обстоятельств, которые не зависят от нас, и по которым мы никак не сможем сегодня предоставить полезное обсуждение по теме.
Завтра в это же время (17:00 МСК) присоединяйтесь к стриму, который мы сможем хорошо для вас подготовить. Будем обсуждать Rich Errors в Kotlin и Union-типы.
Все остальные стримы планируем также по расписанию каждую субботу в 17:00 МСК.
Возникла куча обстоятельств, которые не зависят от нас, и по которым мы никак не сможем сегодня предоставить полезное обсуждение по теме.
Завтра в это же время (17:00 МСК) присоединяйтесь к стриму, который мы сможем хорошо для вас подготовить. Будем обсуждать Rich Errors в Kotlin и Union-типы.
Все остальные стримы планируем также по расписанию каждую субботу в 17:00 МСК.
👍10 4😢2 1
🔴 Мы в прямом эфире!
Тема стрима – Rich Errors: В Kotlin 2.4 появятся Union-типы? Обсудим как это реализовано в других экосистемах, и что именно предлагается ввести в Kotlin.
В этот раз мы подключили чатик к онлайн-трансляции, так что будет сразу видеть ваши сообщение. Но работать он будет только из твича, так что пишите туда.
Telegram | YouTube | Twitch
Тема стрима – Rich Errors: В Kotlin 2.4 появятся Union-типы? Обсудим как это реализовано в других экосистемах, и что именно предлагается ввести в Kotlin.
В этот раз мы подключили чатик к онлайн-трансляции, так что будет сразу видеть ваши сообщение. Но работать он будет только из твича, так что пишите туда.
Telegram | YouTube | Twitch
🔥6❤1 1 1 1
В среду мы готовим полноценный ролик с разбором новой фишки Kotlin – Rich Errors a.k.a. Union-типы для ошибок (если вы из будущего, где ролик уже выложен, то обязательно гляньте!).
Я зарисовал на картинке минимальный пример с демонстрацией новой фичи для работы с ошибками. И да, эта фича вообще никак не связана с исключениями. Слева в типе указывается успешный результат, справа – все виды ошибок, которые могут произойти. Подобно тому, как работает Result в Rust, Either в Haskell, Ocaml, Scala, Error Union Type в Zig и error в Go.
Читайте ниже про новый синтаксис.
Please open Telegram to view this post
VIEW IN TELEGRAM
2❤4 2👍1 1
Особенности error class
Для того, чтобы тип мог использоваться в правой части Union-а, его необходимо объявить через специальную декларацию error class. Ограничения на такие классы:
• error class не может быть abstract/open
• error class не может содержать дженериков
Так почему же в каком-нибудь TypeScript я могу написать:
А в Kotlin эта фича будет работать только для error class-ов?
Для того, чтобы тип мог использоваться в правой части Union-а, его необходимо объявить через специальную декларацию error class. Ограничения на такие классы:
• error class не может быть abstract/open
• error class не может содержать дженериков
Так почему же в каком-нибудь TypeScript я могу написать:
type MessageId = string | number
А в Kotlin эта фича будет работать только для error class-ов?
Перформанс
И этот тот самый случай, когда перформанс НЕ является примером Premature Optimization. Дело в том, что проверка того, является ли один Union-тип подтипом другого Union-типа – это неразрешённая проблема. Это приводит к экспоненциальному росту времени проверки при добавлении новых подтипов в Union-тип.
В других языках такая проблема есть, но с ней живут. Так, в мире TypeScript оптимизация времени проверки типов – это одна из актуальных задач на большом проекте. Но при разделении на "основной" и "побочные" типы, ребята из JetBrains совместно с Ross Tate разработали быстрый алгоритм для проверки на сходство типов.
И этот тот самый случай, когда перформанс НЕ является примером Premature Optimization. Дело в том, что проверка того, является ли один Union-тип подтипом другого Union-типа – это неразрешённая проблема. Это приводит к экспоненциальному росту времени проверки при добавлении новых подтипов в Union-тип.
В других языках такая проблема есть, но с ней живут. Так, в мире TypeScript оптимизация времени проверки типов – это одна из актуальных задач на большом проекте. Но при разделении на "основной" и "побочные" типы, ребята из JetBrains совместно с Ross Tate разработали быстрый алгоритм для проверки на сходство типов.
❤3 2 1
Rich Errors не заменяют sealed interface, а делают работу с неудачными сценариями проще, чем это можно достичь с sealed interface. И это я бы назвал Game Changer-ом для распространения подхода Errors as Values.
Для полноценной замены Union-типов, возможно, стоит ожидать нового удобного синтаксиса для sealed interface из этого тикета в YouTrack.
Rich Errors также не заменяют исключения, и они всё ещё нужны в своей нише, а именно – логические ошибки программиста. Подобно тому, как работает panic в Go и Rust, и fatalError в Swift.
Для полноценной замены Union-типов, возможно, стоит ожидать нового удобного синтаксиса для sealed interface из этого тикета в YouTrack.
Rich Errors также не заменяют исключения, и они всё ещё нужны в своей нише, а именно – логические ошибки программиста. Подобно тому, как работает panic в Go и Rust, и fatalError в Swift.
❤2👍2 2 1
Старая добрая предложка из ВКонтакте появилась в новой версии Telegram. Обновляйте ваши клиенты, и смотрите на кнопочку внизу экрана.
А чтобы пообщаться с сообществом, вступайте в @kotlinmetachat. Я и Эмиль будем отвечать в обоих чатах.
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍5
Посмотрели как к этому вообще пришли, какие есть альтернативы в других экосистемах и почему не хотят реализовывать полноценные Union-типы в Kotlin. Разобрали proposal-ы с обсуждением разработчиков из JetBrains про Union-типы в Kotlin.
И, главное, поняли чем они могут быть лучше sealed interfaces, Result-типов и checked exceptions.
YouTube
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10 3🔥2 2❤1
🔴️️️️️️ Стрим в 17:00 МСК в субботу
Расскажем про fuzz-тестирование и про новую библиотеку kotlinx.fuzz для написания таких тестов.
Обязательно ставьте себе напоминалку и приходите. В этот раз это ваши вопросы будут особо важны, потому что в конечном итоге то, что мы будем смотреть и разбирать, выльется в доклад на Mobius или JPoint.
Telegram | YouTube | Twitch
Расскажем про fuzz-тестирование и про новую библиотеку kotlinx.fuzz для написания таких тестов.
Обязательно ставьте себе напоминалку и приходите. В этот раз это ваши вопросы будут особо важны, потому что в конечном итоге то, что мы будем смотреть и разбирать, выльется в доклад на Mobius или JPoint.
Telegram | YouTube | Twitch
👍5 3🔥2 2
Что же, какое-то длиннопостное настроение на этой неделе. Сегодня поговорим про исключения. Когда их использовать нужно, и когда их использовать не нужно. Идеалом для меня по этой теме был и есть этот пост от Романа Елизарова на Medium.
Крайне советую с ним ознакомиться, сохранить в закладки, и пересылать всем, кто не следует конвенциям, описанным там. И не просто потому что так сказал Роман Елизаров, а потому что в посте очень доходчиво описаны причины таких конвенций. Их же я опишу в следующих постах.
Please open Telegram to view this post
VIEW IN TELEGRAM
Medium
Kotlin and Exceptions
What are Kotlin Exceptions and how should you use them?
❤3 2 1