@kotlin_lang

Страница 552 из 982
Siarhei
19.02.2018
19:08:17
в андроид чате не помогли с этоим

Руслан
19.02.2018
19:08:52
Мне нужно A: C B: C someVal: List<C> when(someVal) { is List<A> -> ... is List<B> -> ... } делать, где A, B унаследованы от одного sealed класса
написать функцию с reified джененироком которая будет капчерить тип, и через KType доставать дженерик параметр и матчить на инстансы

Даниил
19.02.2018
19:09:26
Подредактировал примерчик, чтобы понятнее стало
ну я тебе примерно вариант кинул, но это если ты уверен что не может прийти список где и элементы типа A, и типа B + надо ещё прописать чё делать в случае если приходит пустой список, да

Google
Igor
19.02.2018
19:10:14
Я думал, может какой-то адекватный способ есть.

Даниил
19.02.2018
19:12:30
inline fun <reified T: C> foo(list: List<T>) { when (T::class) { A -> ... B -> ... else -> ... } }

Igor
19.02.2018
19:13:30
merci

Даниил
19.02.2018
19:14:52
sealed class C data class A(val x: Int) : C() data class B(val x: Double) : C() inline fun <reified T: C> foo(list: List<T>) { println(T::class) } fun main(args: Array<String>) { foo(listOf(A(42), A(5))) foo(listOf(B(3.14))) foo(listOf(A(42), B(3.14))) }

вот даже так

выводит A, B, C соответственно

на пустом списке выводит C (как наиболее общий подходящий тип видимо)

Igor
19.02.2018
19:15:48
Супер, то что нужно!

Спасибо огромнейшее ;)

Даниил
19.02.2018
19:20:28
на всякий случай покапитаню – в джаву эта функция торчать конечно не будет, если у тебя вдруг какое-то библиотечное API и если у тебя изначально другая функция возвращает List<C>, то даже если все элементы в ней будут типа A, для компилятора там будет тип C (поэтому я изначально и подумал что это решение тебе не подойдёт)

Даниил
19.02.2018
19:23:27
микс в List<C> – это условно val list : List<C> = if (...) { /* List<A> */ } else { /* List<B> */ }?

Google
Даниил
19.02.2018
19:23:35
нет, не заработает

Igor
19.02.2018
19:25:40
Понял, спасибо.

ну, по итогу просто A::class to someSourceA прокидываю, как самое безболезненное решение ;)

Даниил
19.02.2018
19:33:05
я тут ещё чё подумал – в принципе ты можешь врапать список в sealed class типа: sealed class ListC data class ListA(list: List<A>) : ListC() data class ListB(list: List<B>): ListC()

ну и потом делать что-то типа val list : ListC = if ( ... ) { ListA( /* List<A> */ ) } else { ListB( /* List<B> */ ) } fun foo(list: ListC) { when (list) { is ListA -> ... is ListB -> ... } }

Quantum Harmonizer
19.02.2018
19:35:44
class ReifiedList<T>(val list: List<T>, val type: Class<T>) : List<T> by list

Даниил
19.02.2018
19:36:07
или так

Igor
19.02.2018
19:37:58
Да, тоже вариант. Хотя пока-что наверное оставлю вариант с передачей KClass и unchecked-кастами просто потому, что компактнее

Bogdan
19.02.2018
19:38:46
class ReifiedList<T>(val list: List<T>, val type: Class<T>) : List<T> by list
эту фичу Бреслав хочет убрать

Quantum Harmonizer
19.02.2018
19:39:00
эту фичу Бреслав хочет убрать
да, но, скорее всего, не уберёт)

Bogdan
19.02.2018
19:39:32
да, но, скорее всего, не уберёт)
покрафне мере до этого будет долго идти

Igor
19.02.2018
19:39:34
эту фичу Бреслав хочет убрать
И будем вечно сидеть на котлин 1.2, как сейчас сидим на pre-26х build tools в андроиде :) Потому что новое ломается ;)

Quantum Harmonizer
19.02.2018
19:40:04
Quantum Harmonizer
19.02.2018
19:41:03
И будем вечно сидеть на котлин 1.2, как сейчас сидим на pre-26х build tools в андроиде :) Потому что новое ломается ;)
продолжая оффтоп, с третьим Gradle plug-in нужны build tools не ниже 27, иначе лончер цианогена падает, чуть ли не сегфолтится

Igor
19.02.2018
19:41:51
Quantum Harmonizer
19.02.2018
19:42:59
Igor
19.02.2018
19:44:19
Вах-вах-вах. К счастью, мы для организаций делаем приложеньки, которые закупают два-три типа устройств и на всех все работало.

Quantum Harmonizer
19.02.2018
19:47:02
кому есть дело до CM ?
эм, нуу, это моя основная мобильная ОС

Google
You
19.02.2018
19:47:02
Sergey
19.02.2018
19:47:22
сомневаюсь

неофициальные прошивки всегда ведь были важны (нет)

You
19.02.2018
19:48:24
Почти всегда были

Со времён 2 андроида

Sergey
19.02.2018
19:48:41
тем более они не проходили CTS

Почти всегда были
кому? горстке гиков?

You
19.02.2018
19:48:59
Когда в циан добавляли кучу фич, из которых Гугл ботом брал себе

Quantum Harmonizer
19.02.2018
19:50:44
You
19.02.2018
19:51:05
Гигантское сообщество за этим стоит

Sergey
19.02.2018
19:51:54
относительно чего гигантское?

Artem
19.02.2018
19:52:19
Относительно юзеров ведра

Andrew
19.02.2018
19:52:29
Вы, наверное, о разных сторонах говорите. Многим разработчикам софта действительно на кастомные прошивки насрать, к сожалению, ибо они составляют малый процент пользователей. Но это не отменяет того, что за кастомными прошивками стоит большое число людей. Я сам сижу на линейке и очень ей рад. </срач>

Жабра
19.02.2018
19:53:32
Имхо: когда project treble начнет ставиться в каждый ведрофон - кастомки потеряют большую часть пользователей.

Sergey
19.02.2018
19:53:38
ниразу не видел какой либо статистики по CM(Lineage)

Quantum Harmonizer
19.02.2018
19:54:45
Полтора миллиона активных пользователей. https://stats.lineageos.org/

Quantum Harmonizer
19.02.2018
19:55:25
Сколько ведрофонов? Миллиард? Тогда миллион вполне соизмерим с аудиторией какого-нибудь Meizu.

Artem
19.02.2018
19:55:29
Это не считая других кастомок

Google
Sergey
19.02.2018
19:55:34
Полтора миллиона активных пользователей. https://stats.lineageos.org/
пользователетей гугл пиксель и то в 4 раза больше

Quantum Harmonizer
19.02.2018
19:56:10
пользователетей гугл пиксель и то в 4 раза больше
Я пользователь Google Nexus 5X. И LinageOS. Одновременно.

Sergey
19.02.2018
19:56:19
где нормальный андроид и gp services

Artem
19.02.2018
19:56:47
Я юзер нексус 6р и юзер нитрогена/лос/стока попеременно))

You
19.02.2018
19:56:58
Quantum Harmonizer
19.02.2018
19:57:22
короче, пользователи есть, бездумно ломать инструменты нельзя, предлагаю на этом оффтоп закончить

You
19.02.2018
19:58:06
Да

Andrew
19.02.2018
19:59:49
где нормальный андроид и gp services
Официальный MIUI на китайцах язык не поворачивается назвать нормальным андроидом в сравнении с Lineage OS. На нексусах / пикселях мир не заканчивается, к сожалению. Плейсервисы на линейку завезти существует тысяча и один способ, opengapps суть один из самых удобных на данный момент. Так что не понимаю, в чём проблема с "нормальным андроидом и плейсервисами" в привязке к кастомным прошивкам.

Andrew
19.02.2018
20:01:28
он хотябы CTS проходить, международная версия
Я не отговариваю желающих жрать кактус продолжать его жрать. Каждому своё -- кому бирочка "прошло тесты", кому нормальный UX.

Sergey
19.02.2018
20:01:30
open gapps порезанный до нельзя сервисы, из-за которых часто что-то не работает

Andrew
19.02.2018
20:02:18
open gapps порезанный до нельзя сервисы, из-за которых часто что-то не работает
Он позволяет завезти больше, чем стоит на тех же нексусах, если что. https://github.com/opengapps/opengapps/wiki/Package-Comparison

Quantum Harmonizer
19.02.2018
20:03:15
если кто-нибудь хочет продолжать обсуждение, приглашаю в @pofftop

Andrey
19.02.2018
20:58:06
этой информации в рантайме нет, можно сделать подобное лишь пробежав по элеметам
Этой информации нет в Инстансе, но ее можно вытащить из классп

Vladislav
19.02.2018
21:01:56
Всем привет, никто не сталкивался с проблемой, в js, для доступа к нужному this, часто приходится использовать конструкцию типа val self = js("this") as T. Видел в Typescript для этого this parametres используются. Хотелось бы какое-нибудь решение, чтобы this постоянно явно не присваивать. Пока что написал extension, который принимает лямбду с this в качестве первого аргумента, но все равно как-то не очень удобно постоянно в конце дописывать этот extension.

Sergey
19.02.2018
21:06:56
вроде прболем не было, котлин всегда кмопилировал this во что нужно, сохраняя его где нужно. можете привести пример?

Vladislav
19.02.2018
21:14:23


В Vue, внутри methods или watch

Google
Dibro
19.02.2018
21:20:08
внутри DSL'ей свои this'ы, используй this@... для доступа к нужному

если ты про это, конечно

ide сама подсказывать должна по-идее

Vladislav
19.02.2018
21:26:21
Есть object, который представляет собой Vue-компонент и наследуется от external Vue класса, нормальный доступ к this есть только внутри хуков типа mounted, created. Внутри methods, есть доступ только к this object-a и methods. Для того, чтобы Vue-вский this получить приходится что-то подобное писать.

Vladislav
19.02.2018
21:32:49
Ну здесь да, ну вообще, примерно так выглядит object AppComponent : Vue() {}.

Когда es6 использовал, там при компиляции примерно также и происходило. Удобно было бы, чтобы как в Typescript, можно было написать что-то типа fun myFun(this: Vue)

Dibro
19.02.2018
21:33:52
Vladislav
19.02.2018
21:36:40
Ну здесь да, ну вообще, примерно так выглядит object AppComponent : Vue() {}.
Я немного упростил, там посложнее чуть-чуть, наследованее не напрямую от Vue класса идет, а от базовых абстарктных классов, но смысл тот же.

Vladislav
19.02.2018
21:39:16
В общем-то в typescript definitions это вот так выглядит: type DefaultMethods<V> = { [key: string]: (this: V, ...args: any[]) => any };

Потом при компиляции этот this автоматом подставляется

Andrew
19.02.2018
21:51:40
А у вас там творится та же магия, что и в тайпскриптовом vue-class-component, где базовый класс работает декоратором и в рантайме отсутствует?

Vladislav
19.02.2018
22:30:31
А у вас там творится та же магия, что и в тайпскриптовом vue-class-component, где базовый класс работает декоратором и в рантайме отсутствует?
Ну да, инстанс компонента, это по сути опции, на основе которых vue создаёт свой собственный.

Andrew
19.02.2018
22:35:03
Ну да, инстанс компонента, это по сути опции, на основе которых vue создаёт свой собственный.
Спасибо, надо бы на досуге чекнуть, как оно под капотом сделано.

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