@kotlin_lang

Страница 524 из 982
Ivan
02.02.2018
05:56:43
у других языков мало что есть противопоставить этому: for comprehension, destructuring, pattern matching, flow typing, immutability by default, data objects, null safety, get/set/POJO infrastructure generate by default и это только что навскидку, там много чего еще

Boris
02.02.2018
06:19:47
вот я и хочу узнать)) есть ли уже что-то готовое типа List<String, String> ))))
На днях делал идентичную задачу, в списке нужна пара или сделать класс с двумя (может больше если ещё надо будет данные читать) полями

Google
Ivan
02.02.2018
07:31:58
Расскажите про flow typing
ну тут наверно надо уточнить я про Kotlin Smart casts который можно назвать Flow-sensitive typing

https://en.wikipedia.org/wiki/Flow-sensitive_typing

https://try.kotlinlang.org/#/Kotlin%20Koans/Introduction/Smart%20casts/Task.kt

https://kotlinlang.org/docs/reference/typecasts.html

Oleg
02.02.2018
07:32:39
ясн, спасибо

Руслан
02.02.2018
07:43:55


@angmarr баян?

Каррирование конструктора ??

Igor
02.02.2018
07:47:28
Каррирование конструктора ??
Хм, у меня что-то такого нету. Это какая-то нестабильная версия или либа?

Руслан
02.02.2018
07:47:55
Да вот с утра что-то в голову ударило и написал на 40 строк "либу"

https://gist.github.com/IRus/68f2e811592b9dd3b18dabe68116c964

Vladislav
02.02.2018
07:50:55
Привет. Не могу ответ с сервера обработать. Получаю ошибку. java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 2 path $ Ответ приходит в виде: "{\"id\":2,\"email\":\"forojoo@gmail.com\",\"first_name\":\"Vladislav\",\"last_name\":\"Lebyodkin\",\"patronymic_name\":\"Igorevitch\",\"roles\":[]}" Interface: @GET("api/user/get") fun get_user (@Header("Authorization")header:String):Observable<GetUser> Data class data class GetUser (val id: Long, val email: String, val first_name: String, val last_name: String,val patronymic_name:String, val roles: List<String>) Запрос val call = api.get_user(token) call.observeOn(AndroidSchedulers.mainThread()).subscribeOn(Schedulers.io()).subscribe( { GetUser -> Log.d("Test", GetUser.email) }, { error -> Log.d("Error", error.message) } ) Спасибо.

Google
Boris
02.02.2018
07:51:56
https://gist.github.com/IRus/68f2e811592b9dd3b18dabe68116c964
А практическое какое применение? Или пока просто идея?

Vladislav
02.02.2018
07:53:42
Запрос же)

Boris
02.02.2018
07:54:40
Запрос же)
Что за клиент хоть скажи для прикола

Костя
02.02.2018
07:55:07
Ретрофит и okhttp наверное

Руслан
02.02.2018
07:55:08
А практическое какое применение? Или пока просто идея?
Идея, но мне кажется можно завернуть в такой IoC который будет давать гарантии как dagger, но при этом без кодогенерации и достаточно удобный.

Vladislav
02.02.2018
07:55:55
ретрофит, okhttp, rxjava

Andrew
02.02.2018
07:56:22
Дык эт самое, вам приходит JSON-строка, а вы объект парсить пытаетесь?

Руслан
02.02.2018
07:56:35
Так ведь рефлекшн все рано
Так там только один вызов callBy, или это тоже дорого для андроид?

Ну и если не андроид, то и на сервере вполне ок.

Boris
02.02.2018
07:57:33
Так там только один вызов callBy, или это тоже дорого для андроид?
Ну, под нагрузкой это все равно просядет по сравнению с вызовом конструктора напрямую

Руслан
02.02.2018
07:58:11
Ну, под нагрузкой это все равно просядет по сравнению с вызовом конструктора напрямую
Так то что под нагрузкой можно завернуть в провайдер и провайдер уже будет иметь все нужное и рефлексии не будет.

А в основном же ты поднял "контекст" один раз и юзаешь его

Руслан
02.02.2018
08:00:15
Конечно, но тогда и выигрыша особо никакого
Для меня процент таких случаев достаточно мал, когда я хочу использовать не синглтон скоуп, так что можно и потерпеть в них, тем более гарантии они не ломают.

Boris
02.02.2018
08:01:20
Просто не понимаю, что ты выигрываешь

Это ты хочешь вместо ди использовать?

Google
Руслан
02.02.2018
08:01:59
Да

Но вообще конечно тема с интерфейсами все портит, а они нужны чтобы типы аргументов вытащить

Плохая идея в общем

Boris
02.02.2018
08:03:56
ретрофит, okhttp, rxjava
Так посмотри что там не так с жсоном

Плохая идея в общем
Просто не могу хороший кейз придумать, так то прикольная идея

Vladislav
02.02.2018
08:06:14
Kira
02.02.2018
08:08:37
Хочу каррирование в коте.. просто так..

Igor
02.02.2018
08:10:47
Хочу каррирование в коте.. просто так..
Спорный моменты все таки. Вон в swift оно тоже было, но выкинули в 3.0 тк “оно сильно усложняло язык”. Да и имхо либо автоматическое, либо вообще не надо.

Pavel
02.02.2018
08:40:38
Спорный моменты все таки. Вон в swift оно тоже было, но выкинули в 3.0 тк “оно сильно усложняло язык”. Да и имхо либо автоматическое, либо вообще не надо.
Автоматическое карирование очень удобно. Это было моё первое разочарование после знакомства с котлином.

Igor
02.02.2018
08:49:42
Так язык с перегрузкой методов и дефолтными параметрами - тут автокарирование не завести. Даже скала не смогла. (да и не нужно оно тут почти ни кому, это же инструмент ФП)

Anatoliy
02.02.2018
09:01:05
Всем привет! Кто-нибудь знает, как справится с проблемой когда отладчик не останавливается на брейкпойнтах в INLINE функциях? Или придется ждать обновлений студии и котлина?

Quantum Harmonizer
02.02.2018
09:07:23
Всем привет! Кто-нибудь знает, как справится с проблемой когда отладчик не останавливается на брейкпойнтах в INLINE функциях? Или придется ждать обновлений студии и котлина?
Я обычно перед отладкой убираю inline. Проблема в том, что код, переданный в inline-функцию, гипотетически может быть вставлен в неё от нуля до нескольких раз.

Quantum Harmonizer
02.02.2018
09:24:41
Anatoliy
02.02.2018
09:25:41
Я тоже порыл гугл и нашел, что с инлайном трабла в том, что брейкпойнт по факту будет попадать в "левый" код

/*inline*/ fun
Но это же ППЦ! 1. Это неудобно 2. Может быть много функций 3. Самое важное, что логика кода при этом сильно поменяется

Kira
02.02.2018
09:29:00
Зачастую это просто невозможно

Anatoliy
02.02.2018
09:29:24
Невозможно что, поменять?

Kira
02.02.2018
09:29:32
В инлайне работа с женериками другая

Anatoliy
02.02.2018
09:30:19
Да в инлайн элементарный return иначе работает

Google
Михаил
02.02.2018
09:37:32
Инлайнить руками через ctrl c - ctrl v

Anatoliy
02.02.2018
09:45:55
Инлайнить руками через ctrl c - ctrl v
Но сахарок котлина ведь теряется(

В топку котлин тогда, пиши на яве)

Сергей
02.02.2018
09:47:31
ява эт пздц

Dibro
02.02.2018
09:56:06
думаю могли бы в будущем сделать опцию, чтобы при компиляции для дебага вызовы инлайн методов заменялись обычными (такие же вроде у всех инлайн методов генерятся, чтоб из джавы вызвать можно было), а их уже спокойно дебажить

Sergey
02.02.2018
10:10:57
-Xno-inline

(такая опция есть)

Dibro
02.02.2018
10:19:16
тогда можно сделать её автовключение при дебаге

Alex
02.02.2018
10:27:13
thread(start = true) { var loop = 0 do { if (x > y) { // здесь что-то break } else { Thread.sleep(5000) } loop++ } while (loop < 4) }

подскажите плз, если делаю такую конструкцию, то из-за thread.sleep валятся ANR в консоли гугла

Anatoliy
02.02.2018
10:28:46
Я что-то не понимаю или как? На сколько я знаю, инлайн функция в байткоде выглядит не как вызов функции, а как обычный копипаст кода. Потому там есть плюшачки как функции, так и обычного кода. Если инлайн превратиться в обычную функцию, то часть плюшек потеряется. Или я не прав?

Alex
02.02.2018
10:32:40
а если вместо Thread.sleep сделать так: thread(start = true) { var loop = 0 do { if (x > y) { // здесь что-то break } else { Handler().postDelayed({ // ......... }, 5000) } loop++ } while (loop < 4) } то ругается на Can't create handler inside thread that has not called Looper.prepare()

Alex
02.02.2018
10:33:30
спасибо

Quantum Harmonizer
02.02.2018
10:33:40
Google
Dibro
02.02.2018
10:34:20
non-local returns, reified generics
reified превращается в обычный объект класса, как параметр

Quantum Harmonizer
02.02.2018
10:34:46
reified превращается в обычный объект класса, как параметр
это не только класс, это может быть и generic-тип

Anatoliy
02.02.2018
10:35:11
какие, например, плюшки нельзя сделать через обычный метод?
Выход из корневой функции сделать, когда после инлайн, есть код, но его не надо выполнять по условию в инлайне

Dibro
02.02.2018
10:36:28
надо посмотреть во что компилится инлайн с нелокальными возвратами

Quantum Harmonizer
02.02.2018
10:38:03
можно подробней? недопонял
inline fun <reified T> whatever() { println(object : TypeToken<T>() {}) } ... whatever<List<String>>()

Dibro
02.02.2018
10:40:57
inline fun <reified T> whatever() { println(object : TypeToken<T>() {}) } ... whatever<List<String>>()
fun main(args: Array<String>) { whatever<List<String>>() } fun <T> whatever() { println(object : TypeToken<T>() {}) } open class TypeToken<T>

тоже работает

Quantum Harmonizer
02.02.2018
10:42:00
тоже работает
Работает, но иначе.

В моём примере получается TypeToken<List<String>>, в твоём — TypeToken<Object>.

Проверить можно на TypeToken из Guava или Gson.

Dibro
02.02.2018
10:50:51
да, действительно

Andrew
02.02.2018
10:53:19
Если бы reified можно было без проблем сделать для не-inline функций, его бы наверняка сделали. А вы тут как раз это и обсуждаете. В теории можно было бы, конечно, поступить как в плюсах с шаблонами -- генерить по новому методу на каждый тип, плюс смапить номера строк для дебаг инфо, но я полагаю, что предугадать все возможные вызовы в компайл-тайме для жвм невозможно. Ещё, конечно, можно в дебаг-билдах на борту таскать с собой компилятор... :D

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