@kotlin_lang

Страница 839 из 982
Bogdan
30.08.2018
10:37:40
Гугл, линукс создание демона (сервиса)
Там нада сделать конфиг и поместь в папку /etc/init.d

Maxim
30.08.2018
10:37:52
больше нравится combineLatest
тогда у Observable нужно сделать startWith

Google
Andrew
30.08.2018
10:39:16
Подскажите, как из ktor приложения замутить сервис под Ubuntu? Может есть что-то готовое?
https://plugins.gradle.org/search?term=systemd По готовым плагинам выбор небольшой — аж один, и тот rpm-ы делает. Но в целом это должно без особых проблем решаться с shadowjar — пинаете shadowDistZip, пишете к нему небольшой .service-файл для systemd (это действительно несложная задача, не бойтесь вникнуть), и пакете при надобности оба компонента в deb (тут чуть сложнее, вопрос в формировании папочки debian с конфигами и скриптами и правильных флагах для вызова debuild, который из этого конечный дистр сделает).

Denis
30.08.2018
10:39:16
тогда у Observable нужно сделать startWith
мне нужно сделать 1 обсервабл, потом 2 обсервабл, потом в 3 combineLatest, так?

Gregory
30.08.2018
10:40:21
Спасибо, Андрей. Попробую

Maxim
30.08.2018
10:40:21
зачем?
потому что combineLatest сработает только в тот момент, когда изменятся оба значения

Maxim
30.08.2018
10:42:55
Нет
хорошо, не изменятся, а заэмитятся, если быть точным

balolam
30.08.2018
10:43:27
хорошо, не изменятся, а заэмитятся, если быть точным
Нет, достаточно ивента с одного источника

Обратитесь к документации, вы описываете сейчас zip

Denis
30.08.2018
10:43:57
потому что combineLatest сработает только в тот момент, когда изменятся оба значения
так а как будет выглядеть синтаксис, можете подсказать?

Quantum Harmonizer
30.08.2018
10:44:47
Maxim
30.08.2018
10:44:56
Quantum Harmonizer
30.08.2018
10:45:32
взаимно, http://rxmarbles.com/#combineLatest
тут всё как сказал @discipuli

Google
Maxim
30.08.2018
10:46:04
тут всё как сказал @discipuli
посмотрите ссылку

Quantum Harmonizer
30.08.2018
10:46:18
посмотрите ссылку
так я по выводам из той картинки и отвечаю

Quantum Harmonizer
30.08.2018
10:46:36
меняется один источник — эмитится новое значение

balolam
30.08.2018
10:46:42
погугли) или в личку
Тогда расскажите отличие между zip?

Maxim
30.08.2018
10:46:56
меняется один источник — эмитится новое значение
первый эмит нового потока появляется после эмита с обоих потоков.

Anton
30.08.2018
10:47:05
первый да

Mikhail
30.08.2018
10:47:20
и второй

и третий

Quantum Harmonizer
30.08.2018
10:47:39
не-не

Anton
30.08.2018
10:47:42
нет. второй и третий заберет предыдущий заэмиченный с первого потока

и скомбинит с новым

Mikhail
30.08.2018
10:48:10
zip эмитит только когда оба заэмитили же ну

Mikhail
30.08.2018
10:49:38
а я мимопроходил и влез в разговорм не понимая о чем кто говорит ?

Георгий
30.08.2018
12:37:49
А можно как-то делегировать в поле, которое инициализируется внутри класса, а не параметром конструктора? interface Interface { fun method() } class Trait: Interface { override fun method() {} } // Работает class TypeA(private val impl: Trait) : Interface by impl { } // Не хотит. Unresolved reference: impl class TypeB: Interface by impl { private val impl = Trait() }

Google
Георгий
30.08.2018
12:42:41
Хм. Тогда такой вопрос. Как сделать инстанцирование покрасивше? class TypeA(private val impl: Trait) : Interface by impl fun typeA() = TypeA(Trait());

Andrew
30.08.2018
12:43:20
Естественно только вовне можно так делать. Иначе – увы и ах, у вас объект то еще не будет инициализиpoван на моменте делегиpoвания
open-методы не запрещают вызывать, хотя и не рекомендуют. Тут картина похожая (хотя я не представляю себе, зачем такое может быть нужно).

Quantum Harmonizer
30.08.2018
12:43:46
просто эта фича не развивается, тяжело с ней)

Andrew
30.08.2018
12:44:44
Георгий
30.08.2018
12:46:41
Примерно так у себя и делаю, только конструктор ещё сделал internal.
Вот так будет православно, или лучше первый вариант и internal constructor? class TypeA private constructor(private val impl: Trait) : Interface by impl { companion object { fun new() = TypeA(Trait()) } }

Quantum Harmonizer
30.08.2018
12:47:19
можно второй конструктор или одноимённый фабричный метод

Andrew
30.08.2018
12:47:35
Вот так будет православно, или лучше первый вариант и internal constructor? class TypeA private constructor(private val impl: Trait) : Interface by impl { companion object { fun new() = TypeA(Trait()) } }
Если так, то можно fun new() превратить в operator fun invoke(), дабы получить из компаньона фабрику красивенькую.

Ну а вообще на свой вкус, тут единого мнения нету.

В kotlinx.coroutines, к примеру, используется top-level функция fun Channel(...): Channel вместо фабрики-компаньона.

Георгий
30.08.2018
12:49:42
О, вот так красивенько получается :) Спасибо! class TypeA private constructor (private val impl: Trait) : Interface by impl { constructor(): this(Trait()) }

Di7aK
30.08.2018
12:53:27
не переносите открывающую фигурную скобку плиз

Di7aK
30.08.2018
12:53:46
глаза болят

Георгий
30.08.2018
12:53:54
class TypeA private constructor (private val impl: Trait) : Interface by impl { constructor(): this(Trait()) } Вот так?

Andrew
30.08.2018
12:54:01
О, вот так красивенько получается :) Спасибо! class TypeA private constructor (private val impl: Trait) : Interface by impl { constructor(): this(Trait()) }
Так даже лучше, да. Сходил бы свой вариант переписать, только у меня он волей случая уже в синглтон превратился, о чём я забыл (да простит меня @Harmonizr за упоминание синглтонов всуе).

Георгий
30.08.2018
12:54:38
Это какой-то извpащенный способ создать декоpатоp?
Это извращённый способ эмулировать трейты))

Di7aK
30.08.2018
12:55:01
на цпп когда смотришь за голову держишся, переменные именуют с подчеркиваем, не константы капсом, методы так же

Igor
30.08.2018
12:55:07
Это извращённый способ эмулировать трейты))
Слишком извpащенный, кмк. Pади чего хоть?

Andrew
30.08.2018
12:56:02
лишь бы он был deeply immutable / stateless :)
Увы, пляшу от сишной либы, так что синглтон не мой, я рядом стоял просто)

Google
Quantum Harmonizer
30.08.2018
12:56:30
?

Георгий
30.08.2018
12:57:20
Слишком извpащенный, кмк. Pади чего хоть?
Как менее извращённо это делать?) Пока что ковыряю язык как таковой, смотрю, что как делается, что делается не так, как привычно

Andrey
30.08.2018
12:57:45
О, вот так красивенько получается :) Спасибо! class TypeA private constructor (private val impl: Trait) : Interface by impl { constructor(): this(Trait()) }
А чем вам дефолт значения не понравились? interface Interface { fun foo(): String } class Trait() : Interface { override fun foo(): String = "foo" } class TypeA(private val impl: Interface = Trait()) : Interface by impl

Mikhail
30.08.2018
12:57:56
Слишком извpащенный, кмк. Pади чего хоть?
Иногда хочется множественного наследования

Igor
30.08.2018
12:58:20
Георгий
30.08.2018
12:58:22
Иногда хочется множественного наследования
Вот да) Но понимаешь, что это зло.

Admin
ERROR: S client not available

Di7aK
30.08.2018
12:58:43
я не шарю

Andrew
30.08.2018
12:59:04
что эта строчка значит Interface by impl
Делегация, встроенная в язык.

Георгий
30.08.2018
12:59:08
что эта строчка значит Interface by impl
Это значит, что все вызовы к методам из интерфейса Interface будут делегированы в impl

Andrey
30.08.2018
12:59:12
что эта строчка значит Interface by impl
реализует интерфейс делегированием на impl

Георгий
30.08.2018
12:59:21
Как много способов сказать одно и то же)))

Mikhail
30.08.2018
12:59:30
Вот да) Но понимаешь, что это зло.
Мы так большие презентеры на переиспользуемые части пилим

Di7aK
30.08.2018
12:59:33
только я при этом все равно не понял

Quantum Harmonizer
30.08.2018
13:00:30
только я при этом все равно не понял
кажется, придётся почитать, что в документации пишут

Andrew
30.08.2018
13:00:37
https://kotlinlang.org/docs/reference/delegation.html#implementation-by-delegation

Георгий
30.08.2018
13:00:49
Короткий способ сделать так: interface Interface { fun method(): Int } class Impl: Interface { override fun method() = 42 } class Foo: Interface { private val impl = Impl() override fun method() = impl.method() }

Andrey
30.08.2018
13:00:58
только я при этом все равно не понял
Ну то есть TypeA реализует интерфейс Interface, но все обращения к методам Interface вызывают соответствующие методы для impl

Google
Di7aK
30.08.2018
13:01:53
я знаю в чем ваша проблема

вы пытаетесь писать документацию в википедию простому алкашу

Георгий
30.08.2018
13:03:06
Ну, делегирование - это когда твой дядя просит твоего батю по пути сгонять за сигами, а батя за сигами отправляет тебя

Andrew
30.08.2018
13:03:47
А прелесть встроенной в язык делегации, что если кроме беготни за сигами надо ещё пачку других действий выполнять, в коде строк остаётся столько же.

То есть не надо руками каждую операцию копипастить.

Quantum Harmonizer
30.08.2018
13:04:12
Di7aK
30.08.2018
13:04:17
я еще в шарпе так и понял что за делегаты такие

так что я в общем с этим не знаком

Quantum Harmonizer
30.08.2018
13:04:36
Andrew
30.08.2018
13:04:42
К шарповым делегатам это, в целом, никакого отношения не имеет.

Di7aK
30.08.2018
13:04:55
да знакомый тоже понять не мог зачем они, если есть интерфейсы

Andrew
30.08.2018
13:05:20
Там это просто список коллбеков, одна сторона туда закидывает свои коллбеки, другая сторона их все одним махом вызывает.

По крайней мере, мне так запомнилось.

Георгий
30.08.2018
13:06:35
А чем это удобнее передачи лямбды? o.O

Типа там списком?

Andrew
30.08.2018
13:07:33
Да. На один делегат может подписаться несколько разных слушателей. Для этого они и нужны, собственно.

Но я ж грю, я шарп видел сто лет назад в универе и могу сильно ошибаться :D

Di7aK
30.08.2018
13:09:45
передача лямбды это уже яваскрипт какойто

Георгий
30.08.2018
13:10:59
reentrantReadWriteLock.write { // blah blah }

Передача лямбды)

Igor
30.08.2018
13:11:22
А чем вам дефолт значения не понравились? interface Interface { fun foo(): String } class Trait() : Interface { override fun foo(): String = "foo" } class TypeA(private val impl: Interface = Trait()) : Interface by impl
Кстати, а именно в этом ваpианте пpинципиально наличие impl в TypeA (если его не будет пpи схoжем поведении, вас это устpoит?)

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