Size: a a a

Kotlin Community

2020 May 18

BP

Bogdan Panchenko in Kotlin Community
Bogdan Panchenko
val attach: (Node) -> Unit = if (parent is BorderPane) {
           when (this) {
               parent.top -> {
                   { parent.top = it }
               }
               parent.right -> {
                   { parent.right = it }
               }
               parent.bottom -> {
                   { parent.bottom = it }
               }
               parent.left -> {
                   { parent.left = it }
               }
               parent.center -> {
                   { parent.center = it }
               }
               else -> {
                   {  throw IllegalStateException("Child of BorderPane not found in BorderPane") }
               }
           }
       } else {
           val children = parent.children
           val index = children.indexOf(this);
           { children.add(index, it) }
       }
@noraltavir в первой лямбде добавил it: Node -> и заработало, хотя идяе мне говорит что нужно удалить 😂
источник

AN

Alexander Nozik in Kotlin Community
Bogdan Panchenko
@noraltavir в первой лямбде добавил it: Node -> и заработало, хотя идяе мне говорит что нужно удалить 😂
вывод функциональных типов - это тяжко
источник

AN

Alexander Nozik in Kotlin Community
кстати там вероятно можно что-то типа parent::top::set или как там референс на сеттер делается.
источник

BP

Bogdan Panchenko in Kotlin Community
а еще идея говорит что set/Predicate можно заменить на predicate - но угадайте что я получаю при компиляции 😂
источник

AN

Alexander Nozik in Kotlin Community
Bogdan Panchenko
а еще идея говорит что set/Predicate можно заменить на predicate - но угадайте что я получаю при компиляции 😂
интероп фигу
источник

BP

Bogdan Panchenko in Kotlin Community
а вроде в гредле работало
источник

BP

Bogdan Panchenko in Kotlin Community
Alexander Nozik
интероп фигу
Щас переключюсь на другу ветку и попробую
источник

AN

Alexander Nozik in Kotlin Community
Alexander Nozik
кстати там вероятно можно что-то типа parent::top::set или как там референс на сеттер делается.
parent::top::setter. Но работает только для котлин пропертей
источник

BP

Bogdan Panchenko in Kotlin Community
Bogdan Panchenko
val attach: (Node) -> Unit = if (parent is BorderPane) {
           when (this) {
               parent.top -> {
                   { parent.top = it }
               }
               parent.right -> {
                   { parent.right = it }
               }
               parent.bottom -> {
                   { parent.bottom = it }
               }
               parent.left -> {
                   { parent.left = it }
               }
               parent.center -> {
                   { parent.center = it }
               }
               else -> {
                   {  throw IllegalStateException("Child of BorderPane not found in BorderPane") }
               }
           }
       } else {
           val children = parent.children
           val index = children.indexOf(this);
           { children.add(index, it) }
       }
Забавно, если не указать конкретный тип у переменной то уже ругается идея, но код компилится. А если указать параметер в лямде то наоборот.

Думаю это мавен плагин
источник
2020 May 19

QH

Quantum Harmonizer in Kotlin Community
Товарищи, помогите спроектировать, пожалуйста.
Дано:
sealed class DataType<T> {
   class Simple<T> : DataType<T>()
   class Complicated<T> : DataType<T>()
}
class Custom<T, DT : DataType<T>>(val type: DT)
Нужно принять в функцию объект типа Simple<T> или Custom<Simple<T>>.

Думал сделать общего предка и принимать Common<T, Simple<T>>, но тогда прорастает лишний типовой параметр и получается каша:
sealed class Common<T, DT : DataType<T>> {
   sealed class DataType<T, SELF : DataType<T>>
           : Common<T, SELF>() {
       class Simple<T>
               : DataType<T, Simple<T>>()
       class Complicated<T>
               : DataType<T, Complicated<T>>()
   }
   class Custom<T, DT : DataType<T>>(val type: DT)
           : Common<T, DT>()
}

«Что ты, чёрт побери, делаешь?»
Просто у меня есть базовые типы — строки, числа, блобы, структуры, коллекции — но нужно научиться выражать нативные для SQL типы, например, uuid в Postgres.
источник

КР

Кирилл Романенко... in Kotlin Community
Quantum Harmonizer
Товарищи, помогите спроектировать, пожалуйста.
Дано:
sealed class DataType<T> {
   class Simple<T> : DataType<T>()
   class Complicated<T> : DataType<T>()
}
class Custom<T, DT : DataType<T>>(val type: DT)
Нужно принять в функцию объект типа Simple<T> или Custom<Simple<T>>.

Думал сделать общего предка и принимать Common<T, Simple<T>>, но тогда прорастает лишний типовой параметр и получается каша:
sealed class Common<T, DT : DataType<T>> {
   sealed class DataType<T, SELF : DataType<T>>
           : Common<T, SELF>() {
       class Simple<T>
               : DataType<T, Simple<T>>()
       class Complicated<T>
               : DataType<T, Complicated<T>>()
   }
   class Custom<T, DT : DataType<T>>(val type: DT)
           : Common<T, DT>()
}

«Что ты, чёрт побери, делаешь?»
Просто у меня есть базовые типы — строки, числа, блобы, структуры, коллекции — но нужно научиться выражать нативные для SQL типы, например, uuid в Postgres.
Чтобы одна и та же функция хавала и Simple<T>, и Custom<Simple<T>>?
источник

QH

Quantum Harmonizer in Kotlin Community
Кирилл Романенко
Чтобы одна и та же функция хавала и Simple<T>, и Custom<Simple<T>>?
Да.
источник

V

Vladimir in Kotlin Community
а две функции сделать?
источник

КР

Кирилл Романенко... in Kotlin Community
fun foo(simple: Simple<T>)

fun foo(cs: Custom<Simple<T>>) = foo(cs.type)

:)
Это ведь будет дешевле, чем городить общие абстракции, не? Или у тебя много таких функций?
источник

QH

Quantum Harmonizer in Kotlin Community
Кирилл Романенко
fun foo(simple: Simple<T>)

fun foo(cs: Custom<Simple<T>>) = foo(cs.type)

:)
Это ведь будет дешевле, чем городить общие абстракции, не? Или у тебя много таких функций?
Много. Комбинаторный взвыв будет.
источник

AM

Andrew Mikhaylov in Kotlin Community
Quantum Harmonizer
Много. Комбинаторный взвыв будет.
Мне казалось, без юнион типов комбинаторных взрывов в таких местах не избежать.
источник

QH

Quantum Harmonizer in Kotlin Community
Andrew Mikhaylov
Мне казалось, без юнион типов комбинаторных взрывов в таких местах не избежать.
Да, просто sealed — вполне себе юнион-типы. Но я не хочу добавлять типовой параметр, который в 99% мест сделает мне уродливый DataType<T, *>
источник

AR

Andrei Ruban in Kotlin Community
Ребята, извиняюсь за офтоп вопрос. Кто нибудь уже получил деньги назад за отменённый KotlinConf ? Или купленный билет остаётся валидным до следующей конференции ?
источник

AM

Andrew Mikhaylov in Kotlin Community
Quantum Harmonizer
Да, просто sealed — вполне себе юнион-типы. Но я не хочу добавлять типовой параметр, который в 99% мест сделает мне уродливый DataType<T, *>
А, вон оно чё. Я не сразу за побитыми отступами в первом сообщении разглядел, что именно ты делаешь.
источник

QH

Quantum Harmonizer in Kotlin Community
Andrew Mikhaylov
Мне казалось, без юнион типов комбинаторных взрывов в таких местах не избежать.
На самом деле, ОО-путь вполне годится и симпатичен мне. Только дорого, инлайн-лямбды тут не получится, обязательно два виртуальных вызова.
источник