@kotlin_lang

Страница 674 из 982
Виталий
17.05.2018
13:48:22
Опять же одномерные массивы предпочтительны
если таблица: rows,columns. как я ее в одномерный запихаю)

Alexey
17.05.2018
13:48:49
?

Quantum Harmonizer
17.05.2018
13:49:05
Google
Quantum Harmonizer
17.05.2018
13:49:18
короче, матрицу же можно разложить в линию

Виталий
17.05.2018
13:49:43
Alexey
17.05.2018
13:50:14
Ну многомерные массивы в си, например, моделируются через одномерные, и сделано это, для перфоманса

Виталий
17.05.2018
13:50:21
в таблице типа путь искать по похожим ячейкам... там ад будет

Alexey
17.05.2018
13:50:53
Обернуть массив и написать нужный get не вариант типо?

RichArray(w: Int, h: Int) { val arr: IntArray = IntArra(w * h) fun get(x: Int, y: Int) ... }

Виталий
17.05.2018
13:54:14
Alexey
17.05.2018
13:54:43
Если перфоманс не нужен, то впринципе пофигу

Виталий
17.05.2018
13:54:46
и потом val r = RichArray(10,10) r[1,1]

dimiii
17.05.2018
13:57:22
В соседнем чатике действует недельный запрет на флуд, так что вброшу здесь. Моя внутренняя Ванга вангует в ближайшем будущем пачку языков, транслирующихся в гошечку, как тебе такое -Илон Маск- Андрей Бреслав?

Виталий
17.05.2018
13:57:24
и потом val r = RichArray(10,10) r[1,1]
а это не медленне ? процессорное время всмысле

Виталий
17.05.2018
13:58:17
медленнее чего?)

Google
Alexey
17.05.2018
13:58:38
а это не медленне ? процессорное время всмысле
нет, выделяется один кусок памяти, и близкие в памяти ячейки читаются

А если это будут разные массивы, они будут разбросаны по хипу

Виталий
17.05.2018
13:59:07
медленнее чего?)
Array(10, {IntArray(10,{0})})

Виталий
17.05.2018
14:00:37
Array(10, {IntArray(10,{0})})
так не сделаешь)

Виталий
17.05.2018
14:00:48
А если это будут разные массивы, они будут разбросаны по хипу
я не сильно догоняю, но какая разница с какой части памяти брать - главное как это делать наврерное ?

Виталий
17.05.2018
14:02:00
Array(10, {intArrayOf(0))}) ну или там как то )) типа того

Виталий
17.05.2018
14:09:51
так не сделаешь)
Array(ROWS, { IntArray(COLUMNS, { 0 }) }) - все работает = заполняет нулями двумерный

это про архитектуру памяти вобщем
я динозавр - всё думаю опираясь на спектрум и ассемблер....

Костя
17.05.2018
15:11:48
я не могу в Kotlin сделать так ? fun <T : BaseViewModel> create(): T { return SplashViewModel() } Пишет ошибку, что требует чтобы я в методе отдавал T, но я вроде и отдаю T, т.к. Т наследуются от BaseViewModel и SplashViewModel тоже.. что не так (

Костя
17.05.2018
15:15:25
Постоянно путаю, но попробуйте fun <out T : BaseViewModel>
не помогает, пишет что out можно только для аннотации классов юзать, а если в класс выношу ошибка та же остается

мне кажется или так сделать нельзя просто, или я что-то не так написал в методе

Костя
17.05.2018
15:18:58
тут главный вопрос можно ли в котлин сделать дженерик метод, который будет отдавать разные типы у которых один суперкласс, можно отдавать типо суперкласс, но тогда на другой стороне придется вечно кастить, а хочется чтобы сразу шел нужный тип

можно ли вот вопрос

Костя
17.05.2018
15:19:16
так прокатит

но на выходе я буду иметь BaseViewModel

Google
Костя
17.05.2018
15:19:28
и нужно будет юзать каст

что неочень, собственно для этого и дженерики существуют

только вот не факт что в котлин так можно

Andrew
17.05.2018
15:20:03
А как вы вызываете метод-то? Вы ж обещаете вернуть T, а возвращаете SplashViewModel.

Костя
17.05.2018
15:20:28
а разве не так и нужно ?

оно должно понять что T наследуется от BaseViewModel

и я могу отдавать любого наследника внутри метода

Andrew
17.05.2018
15:21:08
Да нет, внутри метода вы должны отдать T или его наследника.

Костя
17.05.2018
15:21:09
а при вызове я в даймондах укажу тип, и он будет понимать что метод этот тип мне отдаст

ну так в java работает

чтобы был метод который отдает разные ViewModel наследуемые от одной

и на выходе не нужно юзать каст уже

а сразу нужный тип будет

Andrew
17.05.2018
15:22:16
Дык вы объясните человеческим способом, что вам надо. Я пока не понял, чего вы добиться пытаетесь, и почему у вас метод вроде как дженерик, а возвращает конкретный тип.

Andrew
17.05.2018
15:23:34
Вы-то при вызове укажете, что вы вместо <T> конкретное хотите, но тело метода это игнорирует.

Костя
17.05.2018
15:24:04
Дык вы объясните человеческим способом, что вам надо. Я пока не понял, чего вы добиться пытаетесь, и почему у вас метод вроде как дженерик, а возвращает конкретный тип.
ну вот выше, я хочу отдавать из метода наследников какого-то типа, и чтобы потом каст был не нужен когда дергают метод

есть такая возможность ?

ну как я понимаю вопрос в том как сделать у метода возвращаемый тип == наследники BaseViewModel

Google
Костя
17.05.2018
15:26:05
любые, никакой конкретики

Boris
17.05.2018
15:26:14
есть такая возможность ?
Есть, если это не противоречит типизации

Костя
17.05.2018
15:26:14
для этого ж и нужны дженерики

Andrew
17.05.2018
15:26:22
Суть с сигнатурой вы правильно уловили, fun <T: Base> method(): T, а вот с телом метода пока не очень. return Derived не сработает, ибо Derived в общем случае не наследник T.

Va
17.05.2018
15:26:41
as T и не парься

Andrew
17.05.2018
15:26:59
Трудно дать более конкретный совет, ибо пока не ясно, как этот метод опирается на переданное снаружи T.

Boris
17.05.2018
15:27:05
а как
Просто надо возвращать тип, который заявлен в функции

А то как в том анекдоте, что ищу не там где потерял, а там где светло

Костя
17.05.2018
15:27:44
блин, значит я не умею объяснять

dimiii
17.05.2018
15:27:57
Ох вей

Andrew
17.05.2018
15:28:17
У вас просто упрощённый пример оказался слишком упрощённым. Поясните суть вашего create, как он использует на деле T.

Жабра
17.05.2018
15:28:34
блин, значит я не умею объяснять
Я щас потыкал-потыкал, но ничего не нашёл. Скорее всего нельзя.

Boris
17.05.2018
15:28:34
Если т сделать рефайд и потом т::класс.ньюинстанс, то будет норм

Костя
17.05.2018
15:29:21
val viewModel = ViewModelProvider.create<SplashViewModel>(SplashViewModel::class.java)

к примеру так

и viewModel : SplashViewModel

не BaseViewModel

для других viewModel аналогично

Google
Костя
17.05.2018
15:30:01
ну для всех в принципе )

внутри метода будет when который будет смотреть входной типо и создавать объект и отдавать

Boris
17.05.2018
15:31:18
inline fun <reified T:Any> create(): T = T::class.java.newInstance() вот такой код будет работать

Костя
17.05.2018
15:31:21
в идеале если бы он мог вообще сразу на T смотреть

у inline нету подводных камней ? минусов каких, не юзал ещё толком, суть примерно ясна, что код встраивается по итогу в место вызова )

Andrew
17.05.2018
15:32:17
Если вы вяжитесь на JVM, то внутри <reified T: BaseViewModel> и return T::class.newInstance(), как выше верно подсказали, а по уму он должен иметь фабрики этих ваших наследников от BaseViewModel.

Boris
17.05.2018
15:32:36
есть подводные камни, но по-другому к Т доступа в рантайме не получить

Andrew
17.05.2018
15:33:31
Можно просто явно параметром в метод передавать KClass<T>, тогда inline не нужен.

dimiii
17.05.2018
15:33:46
val viewModel = ViewModelProvider.create<SplashViewModel>(SplashViewModel::class.java)
Пока не требуется использование информации об овеществленном типе модели, это всего лишь извращенный способ вызвать конструктор

Костя
17.05.2018
15:34:36
Пока не требуется использование информации об овеществленном типе модели, это всего лишь извращенный способ вызвать конструктор
ну если так рассуждать любое создание объекта в каком-то смысле извращенный способ вызвать конструтор )

но используются же фабрики и т.д. для создания объектов

а не просто конструторы дергаются у каждого и всё, внутри они же и дергаются, да

Andrew
17.05.2018
15:35:46
Правильно, фабрики позволяют убрать вызов конструктора в место, которое точно знает тип, а не использовать newInstance.

Boris
17.05.2018
15:36:44
фабрики они абстрагируют обычно конкретный тип, а тут ты создашь именно тот Т который ты знаешь при вызове. Возможно там проще будет написать что-то типа val viewModel = ViewModelProvider.create<SplashViewModel>(SplashViewModel())

Andrew
17.05.2018
15:36:58
Где-то в одном месте ставится соответствие KClass<X> -> способ создать объект типа X, а потом эти ваши методы вроде create обращаются к зарегистрированным фабрикам.

Жабра
17.05.2018
15:37:22
Щас накопал про Inline properties https://kotlinlang.org/docs/reference/inline-functions.html Это что вообще такое? (о.о)

Andrew
17.05.2018
15:37:24
Об этом, собсна, все эти даггеры и прочие.

Andrew
17.05.2018
15:38:11
Т.е. сахарок над методами get и set. Почему бы их и не инлайнить при надобности.

Костя
17.05.2018
15:38:23
тогда как лучше вынести такой create или сделать, чтобы он был как фабричный метод

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