
Igor
29.01.2018
14:14:29

Yury
29.01.2018
14:14:46
это просто коллбеки, которые компилятор преобразует в код который похож на "синхронный", устраняя колбекхел)
или не правильно понимаю?)

Google

Quantum Harmonizer
29.01.2018
14:18:30

Artem
29.01.2018
14:19:09

Igor
29.01.2018
14:21:46

Yury
29.01.2018
14:22:52

Igor
29.01.2018
14:23:51
Про это я не слышал. Наверное проще написать обертки под разрабатываемый Oracl

Alexandr
29.01.2018
15:11:06
Есть у кого-нибудь пример котлин + даггер 2, включая библиотеку даггер андроид?
Интересуют отличия в реализации

Quantum Harmonizer
29.01.2018
15:12:12

Alexandr
29.01.2018
15:13:02

Quantum Harmonizer
29.01.2018
15:13:26

Alexandr
29.01.2018
15:14:07

Sergey
29.01.2018
15:32:28

Andrew
29.01.2018
15:34:37
https://github.com/JetBrains/kotlin/commits/rr/zarechenskiy2
А тем временем в Kotlin везут inline classes (правда, пока с единственным свойством, то бишь работать это будет только как typedef на стероидах).

Google

Igor
29.01.2018
15:43:49
А пропозал где?

Igor
29.01.2018
15:44:07

Quantum Harmonizer
29.01.2018
15:47:12

Andrew
29.01.2018
15:48:48

Bogdan
29.01.2018
15:49:17

Kirill
29.01.2018
15:49:48
насколько я помню, в первую очередь это ускорит корутины

Andrew
29.01.2018
15:51:24
А примеры их, или для чего они
typealias MyInt = Int определяет новое имя для того же типа.
inline class MyInt(val v: Int) определяет новый тип, на котором можно определить свои операторы, методы и не иметь неявного приведения типов.
class MyInt(val v: Int) тоже определяет новый тип, но этот явный бокс живёт в рантайме, в отличине от inline class, где в рантайме не будет объекта-враппера

Quantum Harmonizer
29.01.2018
15:52:31
Банально, inline class SomeId(val value: UUID) чтобы не подснуть чужой айдищник куда не недо.
по сути newtype

Andrew
29.01.2018
15:53:08
или typedef, кому что ближе :)

Sergey
29.01.2018
15:53:31

Andrew
29.01.2018
15:55:54
AllowContractsForCustomFunctions выглядит многообещающе. Интересно, что такое NewInference :)

Sergey
29.01.2018
15:57:22
а еше можно "как бы" union типы делать с помощью них
например
inline class FeatureOrValue<T>(val value: Any?) {
fun asFeature(): Feature<T> = value as Feature<T>
fun asValue(): T = if (value is Feature) error("...") else value as T
}
или например бесплатный Result<T>

Andrew
29.01.2018
15:59:22
Для полного счастья не хватает сеттеров для свойств, которые умеют принимать типы, отличные от типов самих свойств. Ибо в текущем виде придётся иметь inline set<reified T>()

Sergey
29.01.2018
15:59:29
это нам 1.3 аж осенью ждать походу

Andrew
29.01.2018
16:00:06
Пора начинать жить в мастере :D

Sergey
29.01.2018
16:00:22
eap не будет?

Google

Igor
29.01.2018
16:01:43

Kirill
29.01.2018
16:02:01

Sergey
29.01.2018
16:02:14
А как это можно?
inline class Result<T>(val value: Any?) {
fun asError(): Throwable = value as Throwable
fun asValue(): T = if (value is Throwable) throw value else value as T
}

Kirill
29.01.2018
16:02:36
если коротко: не надо будет на каждый результат(шаг) continuation'a создавать объект
(насколько я помню)

Igor
29.01.2018
16:03:36

Artem
29.01.2018
16:03:48

Sergey
29.01.2018
16:04:18
и тогда гарантированно не сломать

Sergey
29.01.2018
16:05:08

Sergey
29.01.2018
16:05:18
inline class Result<T>(val value: Any?) {
private class Error(t: Throwable)
fun asError(): Throwable? = (value as? Error)?.t
fun asValue(): T = if (value is Error) throw value.t else value as T
}

Kirill
29.01.2018
16:06:05

Sergey
29.01.2018
16:08:02
вот тут кстате обсуждение про Result<T> https://youtrack.jetbrains.com/issue/KT-18608

Andrew
29.01.2018
16:17:34
Почему-то я даже не удивлён, что в обсуждение набежали функциональщики и вытеснили остальных)

Igor
29.01.2018
16:20:26
Ну а зачем здоровым людям Result, когда можно кидать исключения ?

Andrew
29.01.2018
16:24:33
Чтобы хранить и передавать их, как изначально описано в issue? :)

Sergey
29.01.2018
16:25:51
особенно актуально при работе с коллекциями

Igor
29.01.2018
16:27:43

Andrew
29.01.2018
16:29:58
Ну если мы делим разработчиков на разработчиков либ и обычных пользователей, то у последних это обычно уже спрятано за библиотеками, да.

Quantum Harmonizer
29.01.2018
16:30:35
(как это делаю я)

Google

Виталий
29.01.2018
16:33:31
Тут можно задавть вопросы по непооняткам ? )

Andrew
29.01.2018
16:33:50
Тут можно не задавать вопросы, можно ли задавать вопросы.
То бишь дерзайте.

Виталий
29.01.2018
16:35:56
без init как реализовать ? или так и должно быть. Что бы не передавать с дочернего в родительский
вообще думал параметры передавать в родительский класс но туда чето не пихается )
регион должен быть обязательным параметром, остальные по умолчанию

Konstantin
29.01.2018
16:38:12
А что делают методы в init?

Виталий
29.01.2018
16:38:20
Sprite - класс с либы LibGDX

Quantum Harmonizer
29.01.2018
16:38:48

Виталий
29.01.2018
16:38:51
загоняю регион текстуры в родительский класс Спрайт ну и координаты
если упростить, то можно дать ответ без подковырок... ну или промолчать... я третий день кго изучаю
его*
setRegion меняется на region самим котлином, так что я как понял без разницы как мне загонять this.region = region или setRegion(region)

Andrew
29.01.2018
16:42:47
> Tile же не узнает об этом и будет жить в заблуждении?
Tile и не знает ничего об актуальных значениях x, y и т.п., они ж не свойства, а просто параметры конструктора.

Виталий
29.01.2018
16:43:28
а поччему тогда они обявляеются без ошибок без val ?
в конструкторе
он я так понял берет их от родительского Sprite

Andrew
29.01.2018
16:44:05
Если вам нужно в конструкторе вызвать какие-то методы, то делается это в init { ... }, всё нормально.
Ваши region, x, y, width, height -- это параметры конструктора и доступны они только в init { ... }

Quantum Harmonizer
29.01.2018
16:44:52

Виталий
29.01.2018
16:45:04
в книжке вроде смотрел проще как то было... ща найду перечитаю, спасиб )

Google

Andrew
29.01.2018
16:45:15

Quantum Harmonizer
29.01.2018
16:45:21

Andrew
29.01.2018
16:45:41

Виталий
29.01.2018
16:46:17
я гвоорю когда читал, проще выглядило ))) щас пересмотрю )
может показалось)

Andrew
29.01.2018
16:48:27
Я просто не сильно понимаю, куда уже проще -- параметры для конструктора указаны, в "теле конструктора" методы вызваны, всё прекрасно. Просто размазано оно по двум местам, да, но это плата за красоту свойств и параметров конструктора, объявленных в одном месте.

Quantum Harmonizer
29.01.2018
16:48:51

Andrew
29.01.2018
16:48:54
Да, к этому придётся некоторое время привыкать :)

Виталий
29.01.2018
16:48:59
ну просто с этим init получается громоздко... в таком случае можно не задавать параметры таким образом, а просто создать конструктор, или в constructor конструкторе я не смогу явно задать обязательные и не обязательные параметры ? Если так то да ))

Andrew
29.01.2018
16:49:29

Quantum Harmonizer
29.01.2018
16:49:41

Andrew
29.01.2018
16:49:57
А во вторичном конструкторе можно проперти определять?

Quantum Harmonizer
29.01.2018
16:50:03

Виталий
29.01.2018
16:50:07
нужен 1, что бы не передавать то что в данный момент мне не нужно, (проинициализированые параметры были что би)

Igor
29.01.2018
16:50:18

Andrew
29.01.2018
16:50:53
Потому я и говорю, что если нужны и параметры, и проперти, и начальные значения проперти передавать в конструкторе, то вот это вот -- самый простой и адекватный вариант. Вторичный конструктор потащит за собой дублирование кода.

Виталий
29.01.2018
16:51:14
ясно )) спасиб

Andrew
29.01.2018
16:53:30
Как до ECS дойдёте (если вдруг будете использовать, конечно) -- порадуетесь этому синтаксису, с ним объявлять системы и компоненты -- одно удовольствие :)

Виталий
29.01.2018
16:54:08

Quantum Harmonizer
29.01.2018
16:55:08

Виталий
29.01.2018
16:55:21
это радует)