Size: a a a

Kotlin Community

2021 January 06

DK

Denis Kalinochkin in Kotlin Community
Alexander Levin
Пока не понял проблемы. Что идеологически компилятору мешает транслировать (тырю частично синтаксис с js, чтобы не думать)

val { abc } = foo

в

val abc = foo["abc"]

?
А тип какой?
источник

ВМ

Валерий Маевский... in Kotlin Community
По юзкейсам тайпклассов (еяпп что такое тайпкласс)
Библиотечный класс А похож на List, но не реализует его
Библиотечная функция f хочет лист
Сейчас для таких случаев пишется обёртка
Хотя можно и не писать
источник

AN

Alexander Nozik in Kotlin Community
Alexander Levin
Пока не понял проблемы. Что идеологически компилятору мешает транслировать (тырю частично синтаксис с js, чтобы не думать)

val { abc } = foo

в

val abc = foo["abc"]

?
То, что там выражение может стоять в "abc". В JS нет времени компиляции, там это не важно
источник

AN

Alexander Nozik in Kotlin Community
Валерий Маевский
По юзкейсам тайпклассов (еяпп что такое тайпкласс)
Библиотечный класс А похож на List, но не реализует его
Библиотечная функция f хочет лист
Сейчас для таких случаев пишется обёртка
Хотя можно и не писать
Тайп класс тут не особо при чем. Обертка отлично решает эту проблему.
источник

AL

Alexander Levin in Kotlin Community
Alexander Nozik
То, что там выражение может стоять в "abc". В JS нет времени компиляции, там это не важно
Так это же мы упрощаем работу компилятору, не усложняем. Обычно принимает что угодно, а тут ещё проще, константы всякие.
источник

AM

Andrew Mikhaylov in Kotlin Community
Alexander Levin
Так это же мы упрощаем работу компилятору, не усложняем. Обычно принимает что угодно, а тут ещё проще, константы всякие.
Так а в рантайме что должна программа сделать, получив этот вызов?
источник

AM

Andrew Mikhaylov in Kotlin Community
componentN же тоже не просто так не как component(n: Int) сделаны.
источник

AL

Alexander Levin in Kotlin Community
Denis Kalinochkin
А тип какой?
Такой-же, как в случае использования функций componentN.

fun Foo.get(String): Int

val { abc } = foo

тип у abc - Int


fun <T> Foo.get(String): T

val { abc: Boolean } = foo

тип у abc - Boolean
источник

DK

Denis Kalinochkin in Kotlin Community
Alexander Levin
Такой-же, как в случае использования функций componentN.

fun Foo.get(String): Int

val { abc } = foo

тип у abc - Int


fun <T> Foo.get(String): T

val { abc: Boolean } = foo

тип у abc - Boolean
Выглядит как ансейф каст в рантайме
источник

DK

Denis Kalinochkin in Kotlin Community
У каждой componentN конкретный статический тип, а тут нет
источник

с#

саша сок #KotlinGang... in Kotlin Community
Ruslan Ibragimov
Тайпклассы на минималках (ха-ха)
в общем, я читал недавно всякие иссью и там вроде елизаров писал "We are almost ready to add extension block, but first we need to /*сосредоточиться на более приземленных вещах*/ and implement multireceivers"

во факту этот extension блок позволит делать тайпклассы, isn't it ?
источник

AL

Alexander Levin in Kotlin Community
Denis Kalinochkin
У каждой componentN конкретный статический тип, а тут нет
А вот это неправда :)
источник

AL

Alexander Levin in Kotlin Community
Alexander Levin
А вот это неправда :)
Есть вот такая у меня утилитка для Mockito:

object MockUtils {
   inline operator fun <reified T> InvocationOnMock.component1(): T = getArgument(0, T::class.java)
   inline operator fun <reified T> InvocationOnMock.component2(): T = getArgument(1, T::class.java)
   inline operator fun <reified T> InvocationOnMock.component3(): T = getArgument(2, T::class.java)
   inline operator fun <reified T> InvocationOnMock.component4(): T = getArgument(3, T::class.java)
   inline operator fun <reified T> InvocationOnMock.component5(): T = getArgument(4, T::class.java)
   inline operator fun <reified T> InvocationOnMock.get(index: Int): T = getArgument(index, T::class.java)
}
источник

с#

саша сок #KotlinGang... in Kotlin Community
саша сок #KotlinGang
в общем, я читал недавно всякие иссью и там вроде елизаров писал "We are almost ready to add extension block, but first we need to /*сосредоточиться на более приземленных вещах*/ and implement multireceivers"

во факту этот extension блок позволит делать тайпклассы, isn't it ?
interface Summable<T> {
   operator fun T.sum(other: T): T
}

extension Int : Summable<Int>
источник

DK

Denis Kalinochkin in Kotlin Community
Alexander Levin
Есть вот такая у меня утилитка для Mockito:

object MockUtils {
   inline operator fun <reified T> InvocationOnMock.component1(): T = getArgument(0, T::class.java)
   inline operator fun <reified T> InvocationOnMock.component2(): T = getArgument(1, T::class.java)
   inline operator fun <reified T> InvocationOnMock.component3(): T = getArgument(2, T::class.java)
   inline operator fun <reified T> InvocationOnMock.component4(): T = getArgument(3, T::class.java)
   inline operator fun <reified T> InvocationOnMock.component5(): T = getArgument(4, T::class.java)
   inline operator fun <reified T> InvocationOnMock.get(index: Int): T = getArgument(index, T::class.java)
}
Это же моки, там без динамики никак. Но обычным датаклассам она не нужна
источник

AN

Alexander Nozik in Kotlin Community
Alexander Levin
Такой-же, как в случае использования функций componentN.

fun Foo.get(String): Int

val { abc } = foo

тип у abc - Int


fun <T> Foo.get(String): T

val { abc: Boolean } = foo

тип у abc - Boolean
Еще раз, что там будет, если там выражение, а не константная строка?
источник

AN

Alexander Nozik in Kotlin Community
саша сок #KotlinGang
в общем, я читал недавно всякие иссью и там вроде елизаров писал "We are almost ready to add extension block, but first we need to /*сосредоточиться на более приземленных вещах*/ and implement multireceivers"

во факту этот extension блок позволит делать тайпклассы, isn't it ?
Вот поддерживаю всеми руками
источник

AL

Alexander Levin in Kotlin Community
Alexander Nozik
Еще раз, что там будет, если там выражение, а не константная строка?
Зачем при деструктурировании позволять что-то, кроме констант? Как-то не видится, что кому-то нужно:

val { "a".repeat(100) } = foo
источник

AN

Alexander Nozik in Kotlin Community
Alexander Levin
Зачем при деструктурировании позволять что-то, кроме констант? Как-то не видится, что кому-то нужно:

val { "a".repeat(100) } = foo
Ну так тогда так и надо говорить, что там могут быть только константы. И тогда возникает волшебная функция, у которой разный возвращаемый (статический!) тип в зависимости от аргумента. Фигня какая-то
источник

RI

Ruslan Ibragimov in Kotlin Community
Alexander Nozik
Ну так тогда так и надо говорить, что там могут быть только константы. И тогда возникает волшебная функция, у которой разный возвращаемый (статический!) тип в зависимости от аргумента. Фигня какая-то
Он не статический, он зависит от типа справа (например от ключа в мапе)
источник