
Костя
17.05.2018
15:40:04
хотел сделать красиво, создание через один метод завернуть (
придется везде дергать newInstance() у каждого отдельно, ну или конструктор
обидно (

dimiii
17.05.2018
15:40:42
inline fun <reified T: Top> createT(): T = Bottom() as T
- если ты хочешь продолжать эту содомию

Google

dimiii
17.05.2018
15:41:04
но лучше нинада

Boris
17.05.2018
15:41:18

Жабра
17.05.2018
15:41:21

Boris
17.05.2018
15:42:04

dimiii
17.05.2018
15:42:23

Костя
17.05.2018
15:42:35
лучше уж буду создавать объекты отдельно

Boris
17.05.2018
15:43:10
Ну как, если Т будет не боттом ?

Andrew
17.05.2018
15:43:12
тогда как лучше вынести такой create или сделать, чтобы он был как фабричный метод
Я без малейшего понятия, что вы деаете, но самый общий пример выглядит как-то так:
class ViewModelProvider {
private val factories = mutableMapOf<KClass<BaseViewModel>, () -> BaseViewModel>()
fun register(clazz: KClass<BaseViewModel>, factory () -> BaseViewModel) { factories[clazz] = factory }
fun <inline T: BaseViewModel> create() = factiories[T::class]() as T
}
Далее где-то, где вы собираете граф при запуске приложения, дёргаете provider.register(CustomersViewModel::class, { CustomersViewModel() }), а по месту у вас будет работать val cVM = provider.create().
Но это я от балды всё пишу и может не работать.

dimiii
17.05.2018
15:43:18

Костя
17.05.2018
15:43:29
можно и его впилить, разобрался с ним в принципе
но я хотел именно фабрики понять объектов

Google

Костя
17.05.2018
15:44:03
типо через общий метод создавать

Boris
17.05.2018
15:44:18
А зачем?

Костя
17.05.2018
15:44:33
ну не везде ж даггер пихать ?
хз

Andrew
17.05.2018
15:44:37
Вообще нормальные люди инжектят зависимости через конструкторы, а не через контейнеры, которые хранят всё, что только могут хранить.

Костя
17.05.2018
15:44:43
можно, но если не пихать

Жабра
17.05.2018
15:45:05

Boris
17.05.2018
15:45:12

dimiii
17.05.2018
15:45:13

Andrew
17.05.2018
15:45:18
То есть ваш CustomerPresenter (или что вы там делаете) должен принимать CustomerViewModel как параметр конструктора, а не самостоятельно его откуда-то доставать.

dimiii
17.05.2018
15:45:27
test.kt:10:16: error: type parameter bound for T in inline fun <reified T : Top> createT(): T
is not satisfied: inferred type Int is not a subtype of Top
val wtf: Int = createT()

Костя
17.05.2018
15:45:56

Boris
17.05.2018
15:46:02

dimiii
17.05.2018
15:46:06

Boris
17.05.2018
15:46:12

Костя
17.05.2018
15:46:35
Нет
ну скажем так даггер нечто большое, но создавать объекты тоже умеет

Boris
17.05.2018
15:46:58

Костя
17.05.2018
15:47:08
а вообще я его поюзал, захотел снова запить от аннотаций этих
ну их блин

Google

Костя
17.05.2018
15:47:22
)

Andrew
17.05.2018
15:47:31
Почему нет? Даггер вполне себе создаёт объекты, используя @Inject constructor(...).

Костя
17.05.2018
15:47:41
использовать и разобраться, разобрался, чтобы прямо стало хорошо, так не стало совсем (

Boris
17.05.2018
15:48:00
Как раз объекты ты в нем сам создашь, даггер инжекшн их провайдит

Костя
17.05.2018
15:48:01
ну да
но создашь же

Andrew
17.05.2018
15:48:33
Ну окей, если совсем строго писать, то даггер 2 генерирует код, который создаёт объекты, но суть от этого не меняется.

Костя
17.05.2018
15:49:03
сильно че-то не вызвало желания юзать даггер, выглядит он довольно неприятно как по мне ))
куча аннотаций не доставляет удовольствия
может только мне так, я хз

Жабра
17.05.2018
15:49:47
Так, а скажите мне пожалуйста - какой профит от фабрик в котлине?

Andrew
17.05.2018
15:50:01
Он и не нужен там, где девелопер сам управляет временем жизни компонентов. То есть почти везде, где нет андроида ?

Костя
17.05.2018
15:50:29

Andrew
17.05.2018
15:50:32

Жабра
17.05.2018
15:50:50

Andrew
17.05.2018
15:51:44

Жабра
17.05.2018
15:52:49

Andrew
17.05.2018
15:53:08
Фабрика обещает вам T и сама под капотом решает, как это T создавать, откуда брать то, что нужно для этого, и отдавать вам вообще T или его наследника.
Я просто слегка в смятении от этого вопроса — когда она нужна, она нужна и вы это понимаете.

Google

Boris
17.05.2018
15:54:57

Andrew
17.05.2018
15:55:31

Kirill
17.05.2018
15:56:10
Кейс когда есть различные регистрационные действия, которые надо выполнить при создании объекта.
Например.

Boris
17.05.2018
15:57:00
Если ты не можешь принять в конструктор инстанс, а должен его инстанцировать, то самый логичный способ отвязаться от конкретного типа это передавать в конструктор фабрику
В котлине это может быть просто функция
Но суть от этого не меняется

Костя
17.05.2018
15:57:42
неплохо я тут расшевелил )) вопросы )

dimiii
17.05.2018
15:57:45

Andrew
17.05.2018
16:02:37

Boris
17.05.2018
16:22:15
В идеальном мире ?

Igor
17.05.2018
16:27:16

Жабра
17.05.2018
17:29:13
Подскажите, решил попытаться написать функцию, которая композирует две другие функции.
fun main(args: Array<String>) {
val first: (Int) -> String = Int::toString
val second: (String) -> Char = { s: String -> s.first() }
val result: (Int) -> Char = first plus second
}
inline infix fun <A, B, C> ((A) -> B).plus(block: (B) -> C) : ((A) -> C) =
Не знаю что дальше написать. Это вообще возможно?

Alexander
17.05.2018
17:32:52


Жабра
17.05.2018
17:35:34
Материал по документациям, если не понятны использованные конструкции языка:
https://kotlinlang.org/docs/reference/extensions.html
https://kotlinlang.org/docs/reference/lambdas.html
Формальная вещь, которая была выражена этим 'c':
https://en.wikipedia.org/wiki/Function_composition (смотреть раздел примеров, остальное наверное просто так читать не стоит)
Если своими словами.
У нас есть данные. И мы их хотим как-то менять. Умножать, предвращать в другие типы данных и тд.
Такое изменение может быть выражено функцией. Ну например:
val multiplyByTwo = { x: Int -> 2 * x }
Так мы получили функцию, которая берёт число и возвращает число, умноженное на два.
val reverseAsString = { x: Int -> x.toString().reversed() }
Так мы развернули цифры числа и вернули строку.
Если мы хотим применить их, то мы просто пишем multiplyByTwo(5) или reverseAsString(123)
Если хотим применить их вместе, то мы можем написать
reverseAsString(multiplyByTwo(432))
Если же мы хотим получить такую функцию, которая будет делать тоже самое, но не прямо сейчас, то можно написать примерно то же самое:
multiplyByTwoThenReverseAsString = { x: Int -> reverseAsString(multiplyByTwo(x)) }
Однако хочется писать проще, чем каждый раз воротить такие конструкции. Особенно если функций будет не две, а больше.
И выше написанная функция в какой-то мере помогает, т.к. можно написать:
multiplyByTwoThenReverseAsString = multiplyByTwo.c(reverseAsString)
Кода стало меньше (Прошу прощения за большие названия, мне лень придумывать лучше)
Как упомянул Михаил, можно ещё лучше, т.к. просто функция в одну букву читается не очень хорошо. Да и скобочки не помогают. Хотелось бы что-то вроде:
multiplyByTwoThenReverseAsString = multiplyByTwo andThen reverseAsString
И в целом, так тоже можно:
infix fun <A, B, C> ((A) -> B).andThen(f: (B) -> C): (A) -> C = {
f(this(it))
}
Дока: https://kotlinlang.org/docs/reference/functions.html#infix-notation
Наверное всё. Код может не работать, т.к. писался сразу сюда.
Я бы только andThen немного переделал
inline infix fun <A, B, C> ((A) -> B).andThen(crossinline block: (B) -> C) : (A) -> C =
{ a: A -> block(this(a)) }


OlegKrikun
17.05.2018
17:44:04
Промахнулся

Александр
17.05.2018
18:25:08
Всем привет. Искал ответ, но не нашел… Кто подскажет, почему
val items: ArrayList<out String> = ArrayList()
val items2 = ArrayList<out String>()
В первом случае все верно, во втором ошибку подсвечивает?

Vladimir
17.05.2018
19:06:46
И у меня будет вопрос по этому примеру - какой смысл так писать?

Google

Жабра
17.05.2018
19:14:01

Александр
17.05.2018
19:16:14

Kirill
17.05.2018
19:20:33

Жабра
17.05.2018
19:20:59
Я не знал.)

Александр
17.05.2018
19:25:53

Vladimir
17.05.2018
19:36:28

dimiii
17.05.2018
19:46:26
Забавно, я тут поинтересовался полным списком всех модификаторов - оказалось в Kotlin до кучи ключевых слов. https://kotlinlang.org/docs/reference/keyword-reference.html

Жабра
17.05.2018
19:54:55
Вот кстати, хочу задать вопрос - н***я так много кейвордов в языке??? Потоп какой-то. Ужас.

Igor
17.05.2018
20:14:01

Жабра
17.05.2018
20:15:33
Не сильно
Но поменьше
А тут, кажется, на все найдётся кейворд
Даже tailrec, блин, придумали.

OlegKrikun
17.05.2018
20:23:29