Size: a a a

Kotlin Community

2021 January 05

BV

Boris Vanin in Kotlin Community
К тому же, обсуждается вполне конкретная проблема. Другое имя к ней отношения не имеет
источник

BV

Boris Vanin in Kotlin Community
Alexander Levin
Ну может стоит подцепить ещё одну задачу к задаче Overload resolution, поскольку это идейно всё похоже, но везде чуток не совпадает
Я посмотрю, может и правда стоит добавить
источник

AL

Alexander Levin in Kotlin Community
Boris Vanin
Я посмотрю, может и правда стоит добавить
Ну, основная мысль - выглядит, что вы не делаете чего-либо странного и это баг, который надо либо репортить, либо лайкать :)
источник

VP

Vladimir Petrakovich in Kotlin Community
А в чём баг, как компилятор должен выводить тип ресивера?
источник

с#

саша сок #KotlinGang... in Kotlin Community
+
источник

с#

саша сок #KotlinGang... in Kotlin Community
Vladimir Petrakovich
А в чём баг, как компилятор должен выводить тип ресивера?
баг есть, где не работает с простой лямбдой, но работает с переменной (иссью, что @Jellymath выше кидал)
источник

с#

саша сок #KotlinGang... in Kotlin Community
но с ресиверами лучше не сделать
источник

AL

Alexander Levin in Kotlin Community
Vladimir Petrakovich
А в чём баг, как компилятор должен выводить тип ресивера?
Ну идейно звучит, что компилятору не должно быть проблемой отличить строку от числа в лямбде:

class Foo {
   fun bar(stringMaker: () -> String) {
       println("Our maker created ${stringMaker()}")
   }
}

fun Foo.bar(intMaker: () -> Int) = bar { "Int: ${intMaker()}" }

fun main() {
   val foo = Foo()
   val parameter = { 2 }
   foo.bar(parameter)
   //foo.bar { 2 } //doesn't work
   foo.bar { "abc" }
}
источник

VP

Vladimir Petrakovich in Kotlin Community
Alexander Levin
Ну идейно звучит, что компилятору не должно быть проблемой отличить строку от числа в лямбде:

class Foo {
   fun bar(stringMaker: () -> String) {
       println("Our maker created ${stringMaker()}")
   }
}

fun Foo.bar(intMaker: () -> Int) = bar { "Int: ${intMaker()}" }

fun main() {
   val foo = Foo()
   val parameter = { 2 }
   foo.bar(parameter)
   //foo.bar { 2 } //doesn't work
   foo.bar { "abc" }
}
А, ну это вы про возвращаемый тип функции
источник

VP

Vladimir Petrakovich in Kotlin Community
Там речь вроде шла про лямбду с ресивером, тип которого отличается
источник

AL

Alexander Levin in Kotlin Community
Vladimir Petrakovich
Там речь вроде шла про лямбду с ресивером, тип которого отличается
>у меня есть метод у класса и ещё экстеншен с тем же именем и оба принимают лямду.

Да вроде оно. @fogone если не оно, можешь ради интереса свой пример тоже в чат закинуть? :)
источник

AL

Alexander Levin in Kotlin Community
А, сорри, не увидел. Да, я немного другое скинул.
источник

BV

Boris Vanin in Kotlin Community
Alexander Levin
>у меня есть метод у класса и ещё экстеншен с тем же именем и оба принимают лямду.

Да вроде оно. @fogone если не оно, можешь ради интереса свой пример тоже в чат закинуть? :)
Ща я сделаю синтетический пример
источник

OY

Oleg Yukhnevich in Kotlin Community
Alexander Levin
Ну идейно звучит, что компилятору не должно быть проблемой отличить строку от числа в лямбде:

class Foo {
   fun bar(stringMaker: () -> String) {
       println("Our maker created ${stringMaker()}")
   }
}

fun Foo.bar(intMaker: () -> Int) = bar { "Int: ${intMaker()}" }

fun main() {
   val foo = Foo()
   val parameter = { 2 }
   foo.bar(parameter)
   //foo.bar { 2 } //doesn't work
   foo.bar { "abc" }
}
такое можно заставить работать с аннотацией(точное её название не помню), потому что здесь хотя бы понятно как определять, какую из ф-ий брать
а с ресивером это наверно в общем нереально
источник

BV

Boris Vanin in Kotlin Community
Oleg Yukhnevich
такое можно заставить работать с аннотацией(точное её название не помню), потому что здесь хотя бы понятно как определять, какую из ф-ий брать
а с ресивером это наверно в общем нереально
Компилятор отлично с этим справляется, просто не в случае когда я передаю напрямую лямбду в функцию
источник

BV

Boris Vanin in Kotlin Community
источник

BV

Boris Vanin in Kotlin Community
а, это он вообще не то вызвал, ща сделаю полный пример
источник

OY

Oleg Yukhnevich in Kotlin Community
Boris Vanin
Компилятор отлично с этим справляется, просто не в случае когда я передаю напрямую лямбду в функцию
так я именно про лямбду и говорю, а не когда уже созданную просто как параметр передают
если отличается ресивер - то его же никак не определить кроме как указав его через fun T.() {}
источник

BV

Boris Vanin in Kotlin Community
Oleg Yukhnevich
так я именно про лямбду и говорю, а не когда уже созданную просто как параметр передают
если отличается ресивер - то его же никак не определить кроме как указав его через fun T.() {}
так я делаю as T.()->Unit и это не помогает
источник

VP

Vladimir Petrakovich in Kotlin Community
Boris Vanin
так я делаю as T.()->Unit и это не помогает
Сомневаюсь, что кастовать один функциональный тип к другому - это хорошая затея. Но странно, что это не помогает.
источник