gavr_sas
9( никакой структурной типизации нет, но по крайней мере есть возможность создавать анонимные объекты на месте, может пригодится для взаимодействия с JSON. Можно унаследовать этот анонимный объект на месте от чего то другого и сразу же оверрайднуть его проперти…
10) А вот сейчас важно, инлайн функции котлина, это почти что темплейты нима, они инлайнятся по настоящему, в кт, и ретурн оттуда это non local return который вернет из функции в которую был инлайн. Это позволяет реализовать например тот же
Все лямбды принятые в inline функцию тоже inline, чтобы сделать наоборот нужно добавить модификатор
lock statementВсе лямбды принятые в inline функцию тоже inline, чтобы сделать наоборот нужно добавить модификатор
notinline12) Такс, а теперь самая сложная часть моего котлин "доклада", DSL
Для понимания создания DSL нам нужно немножно других фактов
1) В котлине можно перегружать у объектов оператор вызова
5) Тут есть функции расширения, ага как в ниме и C#, любой тип можно расширить своей функций, синтаксис у этого такой
Для понимания создания DSL нам нужно немножно других фактов
1) В котлине можно перегружать у объектов оператор вызова
() с помощью функции operator fun invoke
2) В котлине есть синт сахар как в ниме, если на последним аргументом функции идет лямбда то ее можно вызвать не как foo(a, {x -> toDo}), а как foo(a) {x -> todo}
3) если эта функция принимает только лямбду то можно опустить круглые скобки, если эта лямбда не принимает аргументов то можно опустить ->foo { todo }
4) Разумеется это инлайн лямбда и все будет зерокост5) Тут есть функции расширения, ага как в ниме и C#, любой тип можно расширить своей функций, синтаксис у этого такой
fun String.sas(): Int = 1
"sas".sas() == 1
👍1
gavr_sas
12) Такс, а теперь самая сложная часть моего котлин "доклада", DSL Для понимания создания DSL нам нужно немножно других фактов 1) В котлине можно перегружать у объектов оператор вызова () с помощью функции operator fun invoke 2) В котлине есть синт сахар как…
6) ИИИИ теперь внимание,
1) перегружаем у класса invoke оператор,
2) передаем туда лямбду
3) пускай эта лямбда принимает Функцию Расширения! этого же класса!!!
Так как этот перегруженные оператор invoke принимает только лямбду и никаких больше аргументов, мы можем вызывать его без круглых скобок
Так как лямбда которую он принимает является расширением класса его самого, то внутри этой лямбды мы имеем доступ к полям этого класса.
1) перегружаем у класса invoke оператор,
2) передаем туда лямбду
3) пускай эта лямбда принимает Функцию Расширения! этого же класса!!!
Так как этот перегруженные оператор invoke принимает только лямбду и никаких больше аргументов, мы можем вызывать его без круглых скобок
Так как лямбда которую он принимает является расширением класса его самого, то внутри этой лямбды мы имеем доступ к полям этого класса.
👍1
Такс, а теперь о действительно важном.
Собираем все шесь неиспользованных горбушек, потому что они не влезают в тостер, в одну, режем на кубики, в отдельной миске смешиваем базелик, выдавленный чеснок, паприку, красный черный перец и соль.
0) высыпаем смесь в хлеб и смешиваем
1) кидаем хлеб на сухую! сковородку
2) ждем пока хлеб высохнет минут 7
3) раскидываем кубики сливочново в разные стороны сковородки и перемешиваем шоб получить корочку, если не хватает можно подлить подсолнечного.
Готово, закуска богов за 15 минут и старой неиспользованной булки
Собираем все шесь неиспользованных горбушек, потому что они не влезают в тостер, в одну, режем на кубики, в отдельной миске смешиваем базелик, выдавленный чеснок, паприку, красный черный перец и соль.
0) высыпаем смесь в хлеб и смешиваем
1) кидаем хлеб на сухую! сковородку
2) ждем пока хлеб высохнет минут 7
3) раскидываем кубики сливочново в разные стороны сковородки и перемешиваем шоб получить корочку, если не хватает можно подлить подсолнечного.
Готово, закуска богов за 15 минут и старой неиспользованной булки
👍1
Чеерт, котлин украл из моего языка идею универсального котнрол флов оператора. Их when можно использовать как ряд if elsoв делая по условию в каждой ветке, или как около паттерн матчинг, с ИЛИ вариантами через запятую.
Угадайте где еще можно также
Угадайте где еще можно также
Гайд по пополнению запаса, берем панталоджик или любую игру с кучей диалогов(еще советую Sunless Sea и Skies), Записываем все неясные слова в отдельный блокнотик. Пишем прогу на любимом языке которая будет проверять ваши знания блокнотика.
Чел делает маленькие компутактеры в странных формфакторах https://youtu.be/eR3kf-nUY-s
gavr_sas
6) ИИИИ теперь внимание, 1) перегружаем у класса invoke оператор, 2) передаем туда лямбду 3) пускай эта лямбда принимает Функцию Расширения! этого же класса!!! Так как этот перегруженные оператор invoke принимает только лямбду и никаких больше аргументов…
13) Reified types, это не так круто как звучит, просто изза того что в жабе дженерики erased(так их добавили чтобы не ломать обратную совместимость) рантайм о них ничего не знает, то есть мы даже не можем проверить его тип через T::class.java(скрин 1)
Так вот это можно пофиксить, если функцию сделать inline, а дженерик тип reified. Так как функция инлайнится в место вызова, в котором собственно все о типе T известно, все ограничения erased дженериков спадают. Проблема только в том что инлайн функции нельзя колить из джавы, но это не страшно.
Еще одно применение это перегрузка по возвращаемому значению, ясное дело что обычно так не перегрузишь(разве что в языке есть кт темплейты), а тут с reified можно
Просто делаем switch по дженерик типу дженерик параметра T::class, и кастуем возвращаемое значение в тот же тип
Конечно хотелось бы просто темплейты как в ниме/С++, но с учетом что под капотом жаба и так уже хоть чтото
#kotlin
Так вот это можно пофиксить, если функцию сделать inline, а дженерик тип reified. Так как функция инлайнится в место вызова, в котором собственно все о типе T известно, все ограничения erased дженериков спадают. Проблема только в том что инлайн функции нельзя колить из джавы, но это не страшно.
Еще одно применение это перегрузка по возвращаемому значению, ясное дело что обычно так не перегрузишь(разве что в языке есть кт темплейты), а тут с reified можно
Просто делаем switch по дженерик типу дженерик параметра T::class, и кастуем возвращаемое значение в тот же тип
Конечно хотелось бы просто темплейты как в ниме/С++, но с учетом что под капотом жаба и так уже хоть чтото
#kotlin