Size: a a a

Kotlin Community

2020 November 03

с#

саша сок #KotlinGang... in Kotlin Community
Ilmir
C var пропертями смарт-каст работает, если использовать scope functions, например, let или если завести локальную переменную.
Проблема с let только в том, что он не поддерживает несколько переменных, но это тоже можно обойти
class C {
   var x: String? = "OK"
   val i: Int? = 1

   fun test() {
       (x to i).let { (x, i) ->
           if (x == null || i == null) return
           println(x + i)
       }
   }
}
"но это тоже можно обойти"

ну так написать свою функцию
источник

I

Ilmir in Kotlin Community
саша сок #KotlinGang
"но это тоже можно обойти"

ну так написать свою функцию
И назвать её guard!
источник

IP

Iaroslav Postovalov in Kotlin Community
саша сок #KotlinGang
не хуже сахара для guard точно
но хуже развитого паттерн матчинга
источник

с#

саша сок #KotlinGang... in Kotlin Community
Iaroslav Postovalov
но хуже развитого паттерн матчинга
однозначно, но это не скоро)
источник

IP

Iaroslav Postovalov in Kotlin Community
ну вот скорее всего никогда. Котлин уже сел на dfa в лице смарт кастов, как-то странно будет вводить паттерны
источник

IP

Iaroslav Postovalov in Kotlin Community
стоп
источник

IP

Iaroslav Postovalov in Kotlin Community
Yanis
проверка на null для одной переменной работает нормально, но вот если нужно две переменные проверить начинается попа-боль
а так нельзя?
var x = expr
when (val y = x) {
 is T -> expr
}
источник

IP

Iaroslav Postovalov in Kotlin Community
тут смарткаст 100% проходит
источник

Y

Yanis in Kotlin Community
Iaroslav Postovalov
а так нельзя?
var x = expr
when (val y = x) {
 is T -> expr
}
Если беглым взглядом не понятно что тут такое, то лучше не стоит
источник

I

Ilmir in Kotlin Community
Ilmir
И назвать её guard!
Что-то типа такого
inline fun <T1, R> guard(t1: T1, c: (T1) -> R): R? = if (t1 == null) null else c(t1)
inline fun <T1, T2, R> guard(t1: T1, t2: T2, c: (T1, T2) -> R): R? = if (t1 == null || t2 == null) null else c(t1, t2)
inline fun <T1, T2, T3, R> guard(t1: T1, t2: T2, t3: T3, c: (T1, T2, T3) -> R): R? = if (t1 == null || t2 == null || t3 == null) null else c(t1, t2, t3)

использование
guard(c.a, b, c.x?.c) { a, b, c -> TODO() }
источник

PS

Pavel Shilyagov in Kotlin Community
Эти функции на экране телефона выглядят отменно 👌
источник

AN

Alexander Nozik in Kotlin Community
Pavel Shilyagov
Эти функции на экране телефона выглядят отменно 👌
Это вы еще легендарный котлин флаг не видели
источник

I

Ilmir in Kotlin Community
Alexander Nozik
Это вы еще легендарный котлин флаг не видели
Ну-кась, какой флаг?
источник

AN

Alexander Nozik in Kotlin Community
Ilmir
Ну-кась, какой флаг?
источник

AN

Alexander Nozik in Kotlin Community
источник

I

Ilmir in Kotlin Community
Вариация Odersky carpet, понятно.
источник

AN

Alexander Nozik in Kotlin Community
Ilmir
Вариация Odersky carpet, понятно.
Да, оттуда же.
источник

AN

Alexander Nozik in Kotlin Community
В смысле интероп со скалой
источник

DB

Dmitro Boiko in Kotlin Community
как это разувидеть
источник

VN

Viktor Noskin in Kotlin Community
Dmitro Boiko
как это разувидеть
Породить другое :)
источник