
Quantum Harmonizer
29.05.2018
10:09:52
Как можно передать CLI-аргументы в Kotlin-script из run configuration в IDEA?

Алексей
29.05.2018
10:29:00
Что есть cli аргументы?

Andrew
29.05.2018
10:33:47

Quantum Harmonizer
29.05.2018
10:34:59
Что есть cli аргументы?
CLI — command-line interface. Например, если набрать в терминале java -jar app.jar -a b, то java достаются аргументы -jar app.jar -a b, а в main попадают -a b

Google

Алексей
29.05.2018
10:35:31
Понял

Vladimir
29.05.2018
11:39:29

ISkylake
29.05.2018
11:39:38
нет

Quantum Harmonizer
29.05.2018
11:39:46

ISkylake
29.05.2018
11:40:14
https://leeks.life/Yj2SLr.png
пример cli
вроде как

Quantum Harmonizer
29.05.2018
12:24:54
?

Sergey
29.05.2018
13:42:40


Тимур
29.05.2018
13:52:23
Вопрос про делегирование, есть такой код:
interface I {
fun f()
}
class A : I {
override fun f() {
println("A::f")
}
}
class Registry {
private val a = A()
fun take(): A {
return a
}
}
class Delegate(registry: Registry) : I by registry.take()
Что тут происходит:
при создании класса Delegate вызывается registry.take() и возвращаемый объект в дальнейнем используется для делегирования.
А можно ли сделать такой делегат, чтобы при вызове метода Delegate::f() объект A каждый раз брался из Registry::take() ?

Quantum Harmonizer
29.05.2018
13:53:20

Тимур
29.05.2018
13:54:17
как именно?

Quantum Harmonizer
29.05.2018
13:54:48

Тимур
29.05.2018
14:02:36
непонятно
тут же интерфейс делегируется, а не свойство
можно примером кода пояснить?

Google

Тимур
29.05.2018
14:10:58
я поясню зачем такое надо
допустим у меня есть реестр, из которого я должен каждый раз доставать сервис I при использовании, потому что он может поменяться
соответсвенно при вызове f() надо везде писать так registry.take().f()
а хочется при помощи делегирования сделать враппер, который спрячет этот registry.take()

Andrew
29.05.2018
14:12:04

Sergey
29.05.2018
14:12:38

Andrew
29.05.2018
14:13:26

Quantum Harmonizer
29.05.2018
14:13:27

dimiii
29.05.2018
14:15:15

Quantum Harmonizer
29.05.2018
14:15:42

Mi
29.05.2018
14:15:59

Тимур
29.05.2018
14:17:19

Andrew
29.05.2018
14:17:37

Quantum Harmonizer
29.05.2018
14:18:08

Alexey
29.05.2018
14:27:39

Тимур
29.05.2018
14:29:57
А какой сейчас класс генерируется?
ну сейчас делегат работает так, что он просто при конструировании достает ссылку на нужный объект, запоминает её и потом уже ей делегирует все вызовы.
а надо чтобы не запоминал, а доставал в момент вызова

Quantum Harmonizer
29.05.2018
14:31:00

Тимур
29.05.2018
14:31:56
я ответил
у меня сложилось впечатление, что либо мой вопрос был совсем не понят, либо я совсем не понял ответа

Alexey
29.05.2018
14:37:01

Тимур
29.05.2018
14:41:34

Quantum Harmonizer
29.05.2018
14:42:17

dimiii
29.05.2018
14:47:23

Тимур
29.05.2018
14:47:27

Google

dimiii
29.05.2018
14:47:34
public final class Delegate implements I {
public final I getD();
Code:
0: aload_0
1: getfield #13 // Field d:LI;
4: areturn
public final void setD(I);
Code:
0: aload_1
1: ldc #19 // String <set-?>
3: invokestatic #25 // Method kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull:(Ljava/lang/Object;Ljava/lang/String;)V
6: aload_0
7: aload_1
8: putfield #13 // Field d:LI;
11: return
public Delegate(I);
Code:
0: aload_1
1: ldc #27 // String d
3: invokestatic #25 // Method kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull:(Ljava/lang/Object;Ljava/lang/String;)V
6: aload_0
7: invokespecial #30 // Method java/lang/Object."<init>":()V
10: aload_0
11: aload_1
12: putfield #33 // Field $$delegate_0:LI;
15: aload_0
16: aload_1
17: putfield #13 // Field d:LI;
20: return
public void f();
Code:
0: aload_0
1: getfield #33 // Field $$delegate_0:LI;
4: invokeinterface #36, 1 // InterfaceMethod I.f:()V
9: return
}

Quantum Harmonizer
29.05.2018
14:47:55

dimiii
29.05.2018
14:48:29
работает с аттрибутом #33 тупо заданным в конструкторе

Тимур
29.05.2018
14:49:21

Quantum Harmonizer
29.05.2018
14:50:02

Тимур
29.05.2018
14:51:47

dimiii
29.05.2018
14:53:07
да. это не —те дроиды— тот делегат, что вы ищете
ну а что если take() будет возвращать лямбду?

Тимур
29.05.2018
14:55:20
Жаль, а такая красивая идея была по выпиливанию лишнего кода. Хотя я где то уже слышал, что делегирование - это фича которые сами jetbrains считают не очень удачно сделанной.

Bogdan
29.05.2018
14:55:40
+ не так часто используется

Quantum Harmonizer
29.05.2018
14:56:23

Тимур
29.05.2018
14:57:30

dimiii
29.05.2018
15:08:17
... то получится чудовище, вроде d(Unit).f() которое синтаксически не приукрасить (вроде бы). Шило на мыло

Тимур
29.05.2018
15:10:52

dimiii
29.05.2018
17:28:05
d().f(), вот если бы еще оператор dot можно было переопределить ? но на такие извращения даже в крестах не решились

Andrew
29.05.2018
17:42:46
(хотя смартпоинтеры благодаря этой фиче получились приятными в использовании, да.)


Алексей
30.05.2018
03:22:42
Добрый день
Бегло поискал ссылки на rx чатик, но не нашел
Можно ли в RXJava (или RXKotlin) сделать штатными средствами следующее:
На входе имеем данные, приходящие вразнобой во времени. Необходимо сделать так, чтобы onNext для подписчиков вызывался не чаще определенного времени.
На данный момент решение выглядит так (далее код на Kotlin, но там нетрудно):
val subject = PublishSubject.create<Int>()
val timeSubject = Observable.interval(100L, TimeUnit.MILLISECONDS)
val queue = ArrayDeque<Int>()
subject.subscribe {
queue.offer(it)
}
timeSubject.subscribe {
if (queue.isNotEmpty()) {
println("$it:${queue.pop()}")//Тут действие с сообщениями
}
}

Google

Алексей
30.05.2018
03:22:42
И в общем-то всё хорошо и код рабочий, но RX я подключал не для того, чтобы такие велосипеды строить и хотелось бы понять - умеет ли rx что-то такое сам по себе? Если я правильно понял, существующий метод delay создаёт не задержку между сообщениями, а задержку между сообщением и доставкой сообщения подписчикам.

balolam
30.05.2018
06:20:53
debounce оператор

Алексей
30.05.2018
06:23:52
Не подходит

balolam
30.05.2018
06:24:44
Погуглите список операторов полный

Алексей
30.05.2018
06:26:09
Вот поэтому он и не подходит
1 4 5 7 9 15 16 25 26
1 4 7 10 13 16 19 25 28
Сверху - время события от начала работы проги,
Снизу - время уведомления обсервера от начала работы проги
Интервал - 3

Andrew
30.05.2018
07:07:08


picty
30.05.2018
07:08:58
Ребята, подскажите такой момент:
есть метод, который возвращает пару текстовых полей + Лист с объектами. Данные объекты могут быть А, B, C, D, E типов. У данных типов есть несколько ОБЩИЙ полей(id, type), НО есть и уникальные для каждого типа поля. По TYPE можно понять, что это за тип.
Использую retrofit.
Для приема есть объект и в нём лист с базовым классом(у которого 2 поля id & type):
class GetListResponse(success: Boolean,
@Field("m_list") val list: List<BaseMyTypeResponse>)
Предположим всё пришло и мы имеем лист базового типа объектов.
Далее мне нужно:
а) понять какой объект какого типа. Это делаем по полю type
б) скастить данный объект в нужный тип. И вот тут вопросы:
1) данные типы(A, B, C, D) - должны быть просто data(ну как вариант)?
Я стал создавать классы по типу базового, унаследованные от него, типа:
class MyATypeResponse(id: String, type: String, uniq_filed:String: BaseMyTypeResponse(id, type)
Но потом подумал, что это кажется не верный путь и нужно создавать уже именно data классы и в них кастить.
Верно ли я думаю?
2) как лучше кастить в данном случае?
Спасибо!


Andrew
30.05.2018
07:22:31
Ребята, подскажите такой момент:
есть метод, который возвращает пару текстовых полей + Лист с объектами. Данные объекты могут быть А, B, C, D, E типов. У данных типов есть несколько ОБЩИЙ полей(id, type), НО есть и уникальные для каждого типа поля. По TYPE можно понять, что это за тип.
Использую retrofit.
Для приема есть объект и в нём лист с базовым классом(у которого 2 поля id & type):
class GetListResponse(success: Boolean,
@Field("m_list") val list: List<BaseMyTypeResponse>)
Предположим всё пришло и мы имеем лист базового типа объектов.
Далее мне нужно:
а) понять какой объект какого типа. Это делаем по полю type
б) скастить данный объект в нужный тип. И вот тут вопросы:
1) данные типы(A, B, C, D) - должны быть просто data(ну как вариант)?
Я стал создавать классы по типу базового, унаследованные от него, типа:
class MyATypeResponse(id: String, type: String, uniq_filed:String: BaseMyTypeResponse(id, type)
Но потом подумал, что это кажется не верный путь и нужно создавать уже именно data классы и в них кастить.
Верно ли я думаю?
2) как лучше кастить в данном случае?
Спасибо!
data class нужен тогда, когда он нужен -- если нужны equals + hashCode, объекты будут деструктуризироваться и т.п. Подумайте, есть ли у вас такая необходимость.
Если у вас есть пачка классов с одинаковыми полями и нужно кастоваться с учётом этого, логично предположить, что у вас есть иерархия типов с конечным количеством наследников. Это как раз то, о чём sealed классы. Опишите базовый тип с парой полей, наследников с остальными.
Единственное -- для ретрофита надо написать конвертер, который решит проблему с парсингом JSON не в конкретный тип, а в один из его наследников в зависимости от содержимого. Но когда я последний раз смотрел, в сети были подсказки, как это сделать.


Sankarsana das
30.05.2018
07:28:03
Есть такой код:
async {
while (true) {
Log.d(TAG, "run")
delay(300)
}
}
Сначала пауза между "run" примерно 300 милисек. Но с течением времени работы програмы - эта пауза постоянно увеличивается (через 10 мин работы - пауза - 5 минут!)
Почему так?

Evgeny
30.05.2018
07:44:31


picty
30.05.2018
07:45:15
data class нужен тогда, когда он нужен -- если нужны equals + hashCode, объекты будут деструктуризироваться и т.п. Подумайте, есть ли у вас такая необходимость.
Если у вас есть пачка классов с одинаковыми полями и нужно кастоваться с учётом этого, логично предположить, что у вас есть иерархия типов с конечным количеством наследников. Это как раз то, о чём sealed классы. Опишите базовый тип с парой полей, наследников с остальными.
Единственное -- для ретрофита надо написать конвертер, который решит проблему с парсингом JSON не в конкретный тип, а в один из его наследников в зависимости от содержимого. Но когда я последний раз смотрел, в сети были подсказки, как это сделать.
Про sealed - спасибо, посмотрю.
Про ретрофит - я вот потому и подумал - а обзятельно ли для ретрофита это делать(классы именно для него создавать) - или же хватит базового для ретрофита и, например, sealed классов для A, B, C, D.
И в итоге базовый ретрофита - кастить в sealed class ATypeClass и т.д. Без конвертеров ретрофита
Или так не выйдет?


Gromyk
30.05.2018
08:20:21
Всем привет, есть довольно таки простой вопрос
Как инициализиривать 2д массив рандомными значениями?
Вот моя попытка
var tab = IntArray(3, IntArray(3, {i->Random().nextInt(5).toInt()}))

Quantum Harmonizer
30.05.2018
08:22:19

Alexey
30.05.2018
08:25:52
Почему так часто спрашивают про массивы? ?

Жабра
30.05.2018
08:28:41

Dmitry
30.05.2018
08:29:03

Andrew
30.05.2018
08:29:45
Про sealed - спасибо, посмотрю.
Про ретрофит - я вот потому и подумал - а обзятельно ли для ретрофита это делать(классы именно для него создавать) - или же хватит базового для ретрофита и, например, sealed классов для A, B, C, D.
И в итоге базовый ретрофита - кастить в sealed class ATypeClass и т.д. Без конвертеров ретрофита
Или так не выйдет?
Если у вас есть, положим,
sealed class Request(val type: String)
class MailRequest(type: String, receiver: String)
, то ретрофиту в любом случае нужно понимать, что для "type": "mail" нужно будет создать именно MailRequest (собственно, Request — это абстрактый класс, его объект создать вообще нельзя).
Так что без конвертера вряд ли удастся обойтись.

Google

Quantum Harmonizer
30.05.2018
08:30:41
Ретрофит вообще этим не занимается.

Жабра
30.05.2018
08:30:51
Почему так часто спрашивают про массивы? ?
Ибо когда начинают втыкать в программирование - начинают втыкать в массивы и матрицы. И когда переходят на новый язык - как бы повторяют тот курс, который проходили с предыдущим языком. Я тоже когда только в котлин залез начал раскапывать про массивы и матрицы. :)

Gromyk
30.05.2018
08:31:24
Спасибо большое
Массив массивов — Array; IntArray — массив интов.
val arr = Array(3) { IntArray(3) { Random().nextInt() } }

Leonid
30.05.2018
08:32:32
ещё обычно рекомендуется не создавать объект Random каждый раз заново, а переиспользовать его

Alexey
30.05.2018
08:32:34

Жабра
30.05.2018
08:32:49

Alexey
30.05.2018
08:32:55
Если нужен прям рандом рандомыч, то каждый раз новый

Жабра
30.05.2018
08:33:41
?
А в чём проблема? Работа с числами, массивы, матрицы, связные списки, деревья, графы, стеки, очереди и т.п. - база.

Leonid
30.05.2018
08:35:03
не, к нормальному распределению в математическом смысле слова Random() вообще отношения не имеет
оно скорее равномерное

Quantum Harmonizer
30.05.2018
08:35:18

Dmitry
30.05.2018
08:37:25

Quantum Harmonizer
30.05.2018
08:38:01