Size: a a a

Kotlin Community

2019 December 21

AN

Alexander Nozik in Kotlin Community
В данном случае видимо приоритет у функции выше, поскольку она мембер топ левел класса, но это не совсем очевидно.
источник

ДБ

Дмитрий Борисов in Kotlin Community
Alexander Nozik
При совпадении сигнатур между расширением и мембером, всегда выбирается мембер.
Но в любом случае такие конструкции могут создать грабли и у меня ни компилятор ни даже идея не замечает подвоха
источник

AM

Andrew Mikhaylov in Kotlin Community
Можно написать ишью на ютрек, чтобы на подобное завели инспекцию, как вариант.
источник

AM

Andrew Mikhaylov in Kotlin Community
А там уже ребята сами решат, надо или нет.
источник

AN

Alexander Nozik in Kotlin Community
Дмитрий Борисов
Но в любом случае такие конструкции могут создать грабли и у меня ни компилятор ни даже идея не замечает подвоха
В данном случае конфликт сигнатур нет, потому что с точки зрения рантайма это разные методы. Другое дело, что так не надо делать. Наверное можно ворнинг линта сделать
источник

ДБ

Дмитрий Борисов in Kotlin Community
т.е. если заводить ишу как баг, то лучше завести баг на идею, нежели на компилятор котлина?
источник

AN

Alexander Nozik in Kotlin Community
Дмитрий Борисов
т.е. если заводить ишу как баг, то лучше завести баг на идею, нежели на компилятор котлина?
Это надо в котлиновском трэкере, а они потом сами разберутся, куда это
источник

AN

Alexander Nozik in Kotlin Community
Это не баг, а скорее неоднозначеное поведение
источник

AN

Alexander Nozik in Kotlin Community
там уже есть такие реквесты про всякие варарги и специализацию типов в сигнатурах.
источник

ДБ

Дмитрий Борисов in Kotlin Community
Alexander Nozik
там уже есть такие реквесты про всякие варарги и специализацию типов в сигнатурах.
Да я уже тоже нашёл нечто похожее например вот:
https://youtrack.jetbrains.com/issue/KT-28013
источник

AN

Alexander Nozik in Kotlin Community
Правильная стратегия с такими крайними случаями - это просто так не делать, поскольку от всего не защитишься. Но правило для Идеи никто добавить не мешает
источник

ДБ

Дмитрий Борисов in Kotlin Community
Alexander Nozik
Правильная стратегия с такими крайними случаями - это просто так не делать, поскольку от всего не защитишься. Но правило для Идеи никто добавить не мешает
Не делать самому - это конечно всегда лучший вариант, но что если условная функция doSome() находится в сторонней библиотеке? Там вообще получается так что если где-то например есть пакет "util" внутри которого есть этот  doSome(), то такой код

import util.doSome

fun main() {
   val doSome = "A string"
   doSome()
}

operator fun String.invoke(){
   println("String invocation")
}


Вызовет doSome из пакета util


А вот такой код:

import util.*

fun main() {
   val doSome = "A string"
   doSome()
}

operator fun String.invoke(){
   println("String invocation")
}


Вызовет уже экстеншен у String
источник

AN

Alexander Nozik in Kotlin Community
Дмитрий Борисов
Не делать самому - это конечно всегда лучший вариант, но что если условная функция doSome() находится в сторонней библиотеке? Там вообще получается так что если где-то например есть пакет "util" внутри которого есть этот  doSome(), то такой код

import util.doSome

fun main() {
   val doSome = "A string"
   doSome()
}

operator fun String.invoke(){
   println("String invocation")
}


Вызовет doSome из пакета util


А вот такой код:

import util.*

fun main() {
   val doSome = "A string"
   doSome()
}

operator fun String.invoke(){
   println("String invocation")
}


Вызовет уже экстеншен у String
Если оно не в одном пакете, то у вас по импортам должно быть все видно. Конкретно перегрузка invoke, как и любая внешняя перегрузка операторов - это опасная вещь, которую надо использовать только по необходимости.
источник

K

Kopusha in Kotlin Community
гм, в слаке никогда не видел чтоб боты спамили, а в телеге прям обычное дело для админов это гавно вычищать. Может потому что там инвайты.
источник

ДБ

Дмитрий Борисов in Kotlin Community
Alexander Nozik
Если оно не в одном пакете, то у вас по импортам должно быть все видно. Конкретно перегрузка invoke, как и любая внешняя перегрузка операторов - это опасная вещь, которую надо использовать только по необходимости.
Тут уже получается что идея сломает наш код нажатием на optimize imports в случае если из utils приходит много таких импортов и произойдёт объединение в util.*
источник

AM

Andrew Mikhaylov in Kotlin Community
Kopusha
гм, в слаке никогда не видел чтоб боты спамили, а в телеге прям обычное дело для админов это гавно вычищать. Может потому что там инвайты.
Всё так, пробомбить сотню найденных каналов в телеге сильно проще, чем выискивать, дожидаться инвайтов и спамитт поштучно в конкретные слак-организации.
источник

AN

Alexander Nozik in Kotlin Community
Kopusha
гм, в слаке никогда не видел чтоб боты спамили, а в телеге прям обычное дело для админов это гавно вычищать. Может потому что там инвайты.
В слаке доступ только по приглашению
источник

AN

Alexander Nozik in Kotlin Community
Дмитрий Борисов
Тут уже получается что идея сломает наш код нажатием на optimize imports в случае если из utils приходит много таких импортов и произойдёт объединение в util.*
У вас библиотека и ваш код в одном пакете?
источник

ДБ

Дмитрий Борисов in Kotlin Community
Alexander Nozik
У вас библиотека и ваш код в одном пакете?
Для эксперимента я сделал файл из которого вызывается doSome и производится экспорт пакета util в корневом пакете, а файл с функциями в пакете util
источник

ДБ

Дмитрий Борисов in Kotlin Community
Alexander Nozik
У вас библиотека и ваш код в одном пакете?
источник