Size: a a a

Kotlin Community

2020 April 02

AM

Andrew Mikhaylov in Kotlin Community
Максим
В чём различие между такими саспенд объявлениями?
Это совершенно разные вещи.

В suspendCoroutine передаётся обычная лямбда с параметром continuation, а на выходе получается саспенд-функция. Полезно, когда надо какой-нибудь существующий код с асинхронностью на коллбеках превратить в корутину.

Модификатор suspend на обычной лямбде даёт ей все свойства саспенд-функций, то есть в ней можно вызывать другие саспенд-функции и т.д.
источник

М

Максим in Kotlin Community
Andrew Mikhaylov
Это совершенно разные вещи.

В suspendCoroutine передаётся обычная лямбда с параметром continuation, а на выходе получается саспенд-функция. Полезно, когда надо какой-нибудь существующий код с асинхронностью на коллбеках превратить в корутину.

Модификатор suspend на обычной лямбде даёт ей все свойства саспенд-функций, то есть в ней можно вызывать другие саспенд-функции и т.д.
это понятно, имелось ввиду, что объявления в итоге эквивалентны? или всё-таки есть отличия?
источник

AM

Andrew Mikhaylov in Kotlin Community
Максим
это понятно, имелось ввиду, что объявления в итоге эквивалентны? или всё-таки есть отличия?
Ну снаружи обе эти штуки в итоге являются саспендами, да. Просто тело лямбды в одном случае саспенд, во втором нет.
источник

М

Максим in Kotlin Community
Andrew Mikhaylov
Ну снаружи обе эти штуки в итоге являются саспендами, да. Просто тело лямбды в одном случае саспенд, во втором нет.
спасибо
источник

AO

Alexey Otts in Kotlin Community
Максим
В чём различие между такими саспенд объявлениями?
Ну вот первое понятно зачем, а второе на кой?
источник

BV

Boris Vanin in Kotlin Community
Alexey Otts
Ну вот первое понятно зачем, а второе на кой?
Ну, если тебе надо создать экземпляр саспенд функции, вот же положила
источник

AO

Alexey Otts in Kotlin Community
Но там сразу invoke
источник

BV

Boris Vanin in Kotlin Community
Alexey Otts
Но там сразу invoke
А, зачем на скриншоте, я вообще без понятия
источник

AN

Alexander Nozik in Kotlin Community
У меня тут вопрос возник по разработке либ, наверное к @relizarov. Вот у нас есть разные способы объявлять билдер функции вроде sequence или нового buildList. Мы можем делать их глобальными функциями, как в некоторых случаях делается в стдлибе, но чего-то мне этот вариант не очень нравится. Мы добавляем такие билдеры, скажем в IO, и у нас оказывается куча функций с префиксом build  глобальном скоупе. Два других варианта - это делать фальшивые конструкторы через глобальные функции или компаньоны и третий вариант - это Companion.build. Есть ли какая-то генеральная линия партии? Мне вот первый вариант как-то не очень.
источник

AN

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

BV

Boris Vanin in Kotlin Community
Ну, в стдлибе генеральная линия это делать их в глобальном скоупе
источник

AN

Alexander Nozik in Kotlin Community
Boris Vanin
Ну, в стдлибе генеральная линия это делать их в глобальном скоупе
Не все. Скажем какой-нибудь List{} делается фальшивым конструктором
источник

BV

Boris Vanin in Kotlin Community
Фальшконструктор всего пару раз и мне кажется это не самое удачное решение
источник

AN

Alexander Nozik in Kotlin Community
Boris Vanin
Фальшконструктор всего пару раз и мне кажется это не самое удачное решение
Вот я не уверен, что оно неудачное. В коде читается лучше, чем buildSomething, да и скоуп меньше засоряется
источник

AN

Alexander Nozik in Kotlin Community
Я поэтому и спрашиваю, что не так очевидно
источник

T

Timur in Kotlin Community
А скажите в какой чат можно пойти с вопросами по kotlin dsl в Teamcity?
источник

VP

Vladimir Petrakovich in Kotlin Community
Alexander Nozik
Не все. Скажем какой-нибудь List{} делается фальшивым конструктором
List { } работает немного не так, не через билдер
источник

RE

Roman Elizarov in Kotlin Community
Alexander Nozik
У меня тут вопрос возник по разработке либ, наверное к @relizarov. Вот у нас есть разные способы объявлять билдер функции вроде sequence или нового buildList. Мы можем делать их глобальными функциями, как в некоторых случаях делается в стдлибе, но чего-то мне этот вариант не очень нравится. Мы добавляем такие билдеры, скажем в IO, и у нас оказывается куча функций с префиксом build  глобальном скоупе. Два других варианта - это делать фальшивые конструкторы через глобальные функции или компаньоны и третий вариант - это Companion.build. Есть ли какая-то генеральная линия партии? Мне вот первый вариант как-то не очень.
Генеральная линия на текущий момент — top-level functions. Там где в Java у тебя было import company.module.Foo, что дает дает тебе доступ ко всему "foo API", в Котлине превращается в import company.module.foo.* и точно так же дает тебе доступ ко всему "Foo API".
источник

RE

Roman Elizarov in Kotlin Community
А по неймингу, псевдо-конструкторы лучше называть так же как класс если они "создают экземпляр класса с заданными параметрами". Проще их искать пользователям. Но в случаях когда класс можно "построить" уж очень различными способами (как это происходит с коллекциями), то там приходится креативить.
источник

AN

Alexander Nozik in Kotlin Community
Roman Elizarov
А по неймингу, псевдо-конструкторы лучше называть так же как класс если они "создают экземпляр класса с заданными параметрами". Проще их искать пользователям. Но в случаях когда класс можно "построить" уж очень различными способами (как это происходит с коллекциями), то там приходится креативить.
Я сейчас просто делаю доп. кусок IO. Там возникают новые билдеры типа buildByteArray и чего-то мне не очень нравится, как они все засоряют
источник