@kotlin_lang

Страница 930 из 982
Bogdan
08.10.2018
17:31:53
Понял, спасибо!
Вопрос а что за кейс ? Интересно

Георгий
08.10.2018
17:36:28
Есть очереди звонков, которые через настройки привязываются к филиалу. Данные связок забираются из апихи раз в N минут. Кейс 1: когда звонки в очередь начали лететь до того, как изменили настройки. В этом случае нужно сначала создать очередь-пустышку, в которой данные филиала == null, а потом как только API отдаёт созданную конфигурацию, данные филиала подменяются в прокси и становятся доступны через очередь. Кейс 2: когда настройки изменили, и новые настройки должны стать доступны через прокси после подгрузки из API. Хотел всё это сделать одним оператором by =)) Эх, ну, попытаться стоило))

Георгий
08.10.2018
17:41:11
Что-то как-то из пушки по воробьям ИМО))) Даже вот такой вариант: class TestProxy(var data: Test): Test { override val name: String get() = data.name } чище и понятнее, чем лазание в рефлекшин. Но за идею спасибо ?

Google
Bogdan
08.10.2018
17:42:04
Георгий
08.10.2018
17:45:46
Странно зачем от тогда для data генерит сеттер ? Есть кто из jb ?
Видимо, потому что оно var. И ещё предполагаю, что $$delegate_0 и data - разные поля, потому что, помнится, можно делать что-то в этом роде: class Blah(val field: String): Interface by SomeImpl()

Но это, блин, нифига не интуитивно(( По крайней мере, когда читаешь доки по делегатам. Может, я невнимательно читал, конечно

Георгий
08.10.2018
17:48:28
Почему же? К ней можно обратиться на чтение по имени поля. Тогда получишь новое значение.

Георгий
08.10.2018
17:50:01
Было бы классно, если бы можно было после by как-то указать, что имеешь ввиду ссылку на поле data. Типа, поменялось там - делегация идёт в новое место.

class Clazz(val data: Interface): Interface by &data Типа такого

Andrey
08.10.2018
17:59:56
Что-то как-то из пушки по воробьям ИМО))) Даже вот такой вариант: class TestProxy(var data: Test): Test { override val name: String get() = data.name } чище и понятнее, чем лазание в рефлекшин. Но за идею спасибо ?
Подмен делегата через рефлексию имеет смысл, если делегат о куче методов/полей и пробрасывать их все руками тяжко. Нифига не безопасно и громоздко, но вот рабочий пример: fun main(args: Array<String>) { val proxy = TestProxy(TestData("old")) println(proxy.name) proxy.data = TestData("new") println(proxy.name) } interface Test { val name: String } class TestData(override val name: String) : Test class TestProxy(data: Test) : Test by data { var data: Test = data set(value) { delegateField.set(this, value) field = value } companion object { private val delegateField: Field by lazy { val declaredFields = TestProxy::class.java.declaredFields val field: Field = declaredFields.find { it.name.contains("\$\$delegate") }!! field.isAccessible = true val modifiersField = Field::class.java.getDeclaredField("modifiers") modifiersField.isAccessible = true modifiersField.setInt(field, field.modifiers and Modifier.FINAL.inv()) field } } }

Ремерка: это грязный хак и не советую его использовать без вот прям крайней нужды (100500 полей/методов в делегате, которые надо пробрасывать руками)

Google
Quantum Harmonizer
08.10.2018
18:03:17
другой вариант с рефлексией: динамический прокси

Георгий
08.10.2018
18:04:33
Quantum Harmonizer
08.10.2018
18:05:24
«торжественно клянусь, что замышляю только шалость»

Andrey
08.10.2018
18:06:21
«торжественно клянусь, что замышляю только шалость»
Ага. Хороша шалость, поменять в рантайме private final поле, добавленное в байт код компилятором :)

Quantum Harmonizer
08.10.2018
18:06:48
Руслан
08.10.2018
18:07:33
Кто-нибудь метрики по корутинам/фьючам/любой другой асинхронщине собирает?

Andrey
08.10.2018
18:07:52
у кого-то Gson такие шалости в проде творит)
Gson'у только дай повод. Он и Nothing инстанциирует в лёт.

Quantum Harmonizer
08.10.2018
18:11:49
Кто-нибудь писал правила для DeteKt или работал с PSI котлина? Какой верный способ вытащить тело метода (сомневаюсь в правильности function.children.last()) и пройтись по нему?

dimiii
08.10.2018
18:13:52
>Nothing инстанциирует в лёт. шалость удалась

Жайык
08.10.2018
18:15:33
Всем привет можете подсказать использую Kodein в проекте есть класс DBHelper с релизаций SQlite и есть класс MainPresenter подскажите как обратится с класса MainPresenter к классу DBHelper через Кодин

немогу их связать)

eshch
08.10.2018
18:26:13
а в котлине есть бесконесный цикл без мерзкого while(true)?

Quantum Harmonizer
08.10.2018
18:27:07
а в котлине есть бесконесный цикл без мерзкого while(true)?
inline fun loop(func: () -> Unit): Nothing { while (true) func() }

Bogdan
08.10.2018
18:27:27
eshch
08.10.2018
18:29:51
inline fun loop(func: () -> Unit): Nothing { while (true) func() }
да, но почему в библиотеке нету?

Bogdan
08.10.2018
18:30:10
Руслан
08.10.2018
18:30:11
Потому что это нужно практически никогда

Google
eshch
08.10.2018
18:30:13
само понятие "цикл" мерзкое
согласен, но структуры данных в основном не фпшные

Bogdan
08.10.2018
18:30:58
есть "бесконечный" сиквенс, ну или можно его сделать

Руслан
08.10.2018
18:31:40
Ну вот да, такое. Если это очень нужно (в чем проблема написать while(true)?) и полезно в проектах, то можно сделать мини библиотечку для себя и выкинуть её на maven

Mikhail
08.10.2018
18:32:12
да, но почему в библиотеке нету?
Ну он нужен бывает один раз в main и покрывается конструкцией while(true). Зачем ему вообще быть в stdlib?

Nameless
08.10.2018
18:32:16
Потому что это нужно практически никогда
зависит от стиля написания кода

Bogdan
08.10.2018
18:32:30
да, но почему в библиотеке нету?
что бы не засорять, ведь запилиил, будут держать пару лет

Mikhail
08.10.2018
18:33:02
зависит от стиля написания кода
Это что за стиль такой, с бесконечными циклами повсюду?

Bogdan
08.10.2018
18:33:11
зависит от стиля написания кода
делать все на бесконечных циклах ?

Quantum Harmonizer
08.10.2018
18:33:25
я вот вообще считаю, что 2/3 stdlib должны быть отдельными, необязательными артифактами

Nameless
08.10.2018
18:33:26
Это что за стиль такой, с бесконечными циклами повсюду?
разница между не никогда и повсюду очень большая ?

Mikhail
08.10.2018
18:33:50
И вообще, разве фреймворков нет?

Quantum Harmonizer
08.10.2018
18:34:23
Bogdan
08.10.2018
18:34:29
ох уж эти ваши андроды

Quantum Harmonizer
08.10.2018
18:34:56
ох уж эти ваши андроды
мне и в серверной разработке не нравятся всякие гуавы

Mikhail
08.10.2018
18:35:12
Считаю. Настроен.
Ну а в чем проблема тогда?

Bogdan
08.10.2018
18:35:16
Mikhail
08.10.2018
18:35:25
Оно же выпиливается все

Bogdan
08.10.2018
18:35:36
причем тут котлин std либа

Google
Quantum Harmonizer
08.10.2018
18:35:41
Ну а в чем проблема тогда?
Не включать же ProGuard в дебажных сборках. А дексить долго.

причем тут котлин std либа
При том, что это «решение для всего»

Mikhail
08.10.2018
18:36:00
И сильно будет быстрее без стдлибы?

Есть бенчи?

Quantum Harmonizer
08.10.2018
18:37:05
И сильно будет быстрее без стдлибы?
сильно быстрее будет без всего. Конечно, когда есть AppCompat, stdlib играет последнюю роль.

Bogdan
08.10.2018
18:37:30
При том, что это «решение для всего»
учитывая что компилятор поти все заменяет... std не такая уж большая. Вот tornadoFX либой сложно назвать, fraemwork

пока единий минус котлина (существенный), слишком много промежуточных классов

eshch
08.10.2018
18:38:28
Ну вот да, такое. Если это очень нужно (в чем проблема написать while(true)?) и полезно в проектах, то можно сделать мини библиотечку для себя и выкинуть её на maven
проблема в том что тру лишний. проблема просто в подходе. я считаю, что везде надо совать удобные дефолты.

Mikhail
08.10.2018
18:38:52
Admin
ERROR: S client not available

Руслан
08.10.2018
18:39:44
проблема в том что тру лишний. проблема просто в подходе. я считаю, что везде надо совать удобные дефолты.
Я не вижу проблемы в текущих дефолтах. Частота использования бесконечных циклов очень маленькая.

Bogdan
08.10.2018
18:40:05
Они вроде могут инлайниться прогардом
я не юзаю прогард, да и tornadoFX, где я этот недостаток увидел. Но как бы меня не сильно это волную, просто надеюсь сделаю когда-то. Ведь пилять новый компилятор с новой архитектурой

Mikhail
08.10.2018
18:40:33
Я видел твит Вортона, что он прогнал новый shrinker андроида R8 и он заинлайнил весь бойлерплейт даггера прямо в место DI

Mikhail
08.10.2018
18:41:20
тру избыточен
Нифига не избыточен

Руслан
08.10.2018
18:41:30
тру избыточен
Почему? Как сделать лучше?

Mikhail
08.10.2018
18:41:34
Семантика while очень проста и понятна

while (<выражение>) <выражение>

И никаких спец кейсов

Google
eshch
08.10.2018
18:42:49
Почему? Как сделать лучше?
ну например while без аргументов

Mikhail
08.10.2018
18:42:56
Никакого дефолта нету

Руслан
08.10.2018
18:43:17
ну например while без аргументов
И станет принципиально лучше?

eshch
08.10.2018
18:43:55
почему нет?

Quantum Harmonizer
08.10.2018
18:44:39
ну вообще, мне нравится loop {} в Rust, но я не вижу никакой проблемы в его отсутствии.

eshch
08.10.2018
18:45:21
у вас странные категории зрения

если нет, то и не надо

есть и хер с ним

Руслан
08.10.2018
18:45:44
почему нет?
А почему да? Потому что нужно будет писать на 6 символов меньше? И для этого вводить отдельный синтаксис while без boolean expression?

Денис
08.10.2018
18:46:18
почему нет?
Ты чего-то не понимаешь, proof of burden lies with [positive] affirmation. Если ты говоришь, что это надо и "с этим лучше", то ты должен доказать, что это так. Никто не обязан доказывать, что необходимо отсутствие.

Mikhail
08.10.2018
18:47:24
почему нет?
если ты не сделал до сих пор себе утильный метод loop значит проблема не стоит даже того чтобы ее рассматривать

Денис
08.10.2018
18:48:03
есть и хер с ним
Угу, покажи мне тот бесконечный ряд программистов, у которого есть время под каждую такую хотелку переписывать компилятор и его части.

Руслан
08.10.2018
18:49:42
И будет два способа выразить одну мысль: while { // ... } и например у меня есть условие при котором while должен стать бесконечным while (isDeamon) { } который хорошо сочетается визуально с существующим while (true) { }

Real life example: Вот есть либа, kotlinx.coroutines, там на 36212 строчек кода на котлине есть 133 while (true). Вроде не глупые люди пишут, и проблем с этим не испытывают

Mikhail
08.10.2018
18:51:18
и кстати, если перевести while с английского, будет "пока". сразу впрос: "пока что?"

Руслан
08.10.2018
18:51:41
И вот потом придет кто-то и скажет: "А зачем вы ввели loop, есть же while (true)"

Dmitriy
08.10.2018
18:52:38
until

?

Nameless
08.10.2018
18:53:16
for (;;) { } алл хайль макаронному монстру

Страница 930 из 982