Size: a a a

Kotlin Community

2020 October 13

АО

Алексей Овсянников... in Kotlin Community
Oleg Yukhnevich
а вот интересно, как часто нужны одинаково важные ресиверы, по сравнению с решением с primary ресивером
чаще всего, доп ресивер нужен для контекста какого-то, а сама уже ф-ию всё же вызывается на каком-то интсансе
чаще код будет такой: with(a) { b.foo()} чем такой with(a) { with(b) { foo() } }
и тогда, решение с декоратором with выглядит намного логичнее
я согласен, что с этого ракурса всё ок, НО как декоратор это накладывает главную проблему всех этих apply/run/with - неизвестно, что у тебя в итоге получится в ресиверах и у чего конкретно ты будешь вызывать какой-либо метод
источник

SB

Sergey Barmin in Kotlin Community
Oleg Yukhnevich
а вот интересно, как часто нужны одинаково важные ресиверы, по сравнению с решением с primary ресивером
чаще всего, доп ресивер нужен для контекста какого-то, а сама уже ф-ию всё же вызывается на каком-то интсансе
чаще код будет такой: with(a) { b.foo()} чем такой with(a) { with(b) { foo() } }
и тогда, решение с декоратором with выглядит намного логичнее
я конечно  хз как для большинства, но почему-то под мультиресиверами я не подразумеваю никогда конструкцию реализуемую через with { with {} } просто чтобы получить два класса в контексе, эта задача то в общем то уже решена и хочется просто упростить запись

я почему-то всегда думал что проблема именно в функциональном типе мультиресивера
источник

D

Denys in Kotlin Community
Sergey Barmin
я конечно  хз как для большинства, но почему-то под мультиресиверами я не подразумеваю никогда конструкцию реализуемую через with { with {} } просто чтобы получить два класса в контексе, эта задача то в общем то уже решена и хочется просто упростить запись

я почему-то всегда думал что проблема именно в функциональном типе мультиресивера
Какие ваши доказательства

Елизаров просил накидать им юзкейсов :)
источник

OY

Oleg Yukhnevich in Kotlin Community
Sergey Barmin
я конечно  хз как для большинства, но почему-то под мультиресиверами я не подразумеваю никогда конструкцию реализуемую через with { with {} } просто чтобы получить два класса в контексе, эта задача то в общем то уже решена и хочется просто упростить запись

я почему-то всегда думал что проблема именно в функциональном типе мультиресивера
эта задача то в общем то уже решена и хочется просто упростить запись - что имеешь в виду?
источник

SB

Sergey Barmin in Kotlin Community
Oleg Yukhnevich
эта задача то в общем то уже решена и хочется просто упростить запись - что имеешь в виду?
что with { with{}} можно написать уже сейчас
источник

АО

Алексей Овсянников... in Kotlin Community
Sergey Barmin
что with { with{}} можно написать уже сейчас
Именно
источник

VP

Vladimir Petrakovich in Kotlin Community
Sergey Barmin
я конечно  хз как для большинства, но почему-то под мультиресиверами я не подразумеваю никогда конструкцию реализуемую через with { with {} } просто чтобы получить два класса в контексе, эта задача то в общем то уже решена и хочется просто упростить запись

я почему-то всегда думал что проблема именно в функциональном типе мультиресивера
Проблема скорее в невозможности объявления функции, которая должна быть доступна только в контексте более одного ресивера (кроме member extensions)
источник

OY

Oleg Yukhnevich in Kotlin Community
Sergey Barmin
что with { with{}} можно написать уже сейчас
только если это твой класс - тогда через member extension
а если это View андроида, или ещё что?
источник

VP

Vladimir Petrakovich in Kotlin Community
У функциональных типов без разницы, ресивер там или просто аргумент
источник

SB

Sergey Barmin in Kotlin Community
Vladimir Petrakovich
Проблема скорее в невозможности объявления функции, которая должна быть доступна только в контексте более одного ресивера (кроме member extensions)
ну вот да
источник

SB

Sergey Barmin in Kotlin Community
Oleg Yukhnevich
только если это твой класс - тогда через member extension
а если это View андроида, или ещё что?
а пример можно? не очень понимаю проблему
источник

с#

саша сок #KotlinGang... in Kotlin Community
Sergey Barmin
а пример можно? не очень понимаю проблему
val (View, Int).dp get() = this * resources.displayMetrics.density
источник

VP

Vladimir Petrakovich in Kotlin Community
Sergey Barmin
а пример можно? не очень понимаю проблему
Пример со слайда: экстеншен для Float, который должен работать только в контексте View (класс из фреймворка)
источник

PE

Pavel Erokhin in Kotlin Community
саша сок #KotlinGang
val (View, Int).dp get() = this * resources.displayMetrics.density
классический пример, только его и вижу)
источник

с#

саша сок #KotlinGang... in Kotlin Community
Pavel Erokhin
классический пример, только его и вижу)
зачем что-то придумывать ?
источник

АО

Алексей Овсянников... in Kotlin Community
саша сок #KotlinGang
зачем что-то придумывать ?
Справедливости ради, это - новый синтаксис, конфликтующий с компонентами
источник

PE

Pavel Erokhin in Kotlin Community
саша сок #KotlinGang
val (View, Int).dp get() = this * resources.displayMetrics.density
не очень понтяон в таком коде, что такое this тогда?
источник

с#

саша сок #KotlinGang... in Kotlin Community
Pavel Erokhin
не очень понтяон в таком коде, что такое this тогда?
this@Int*
источник

PE

Pavel Erokhin in Kotlin Community
а как ты вью умножил на денсити?
источник

АО

Алексей Овсянников... in Kotlin Community
саша сок #KotlinGang
зачем что-то придумывать ?
ну то есть добавить его сложнее, чем написать декоратор:)
источник