
Vladislav
26.03.2018
09:13:15

Тимур
26.03.2018
09:14:15
Лишь бы не табами
дурацкий вопрос: а чем табы плохи? знаю что многим не нравится, но самому это никогда особо не мешало

Konstantine
26.03.2018
09:15:24
Не знаю насколько оно истинно.

Google

Vladimir
26.03.2018
09:16:36
Не знаю насколько оно истинно.
Ну да, так и есть, сталкивался с тем, что всё едет при открытии на другой системе или в другом редакторе (или в git diff)

Денис
26.03.2018
09:17:08
Кажется, проблема решается на 110% использованием средств разработки,которые способны нормально обработать отображение N пробелов/табов в начале строки так, как этого хочет пользователь. Нет?

Konstantine
26.03.2018
09:17:53
Решается это просто - использованием пробелов:)
Idea вроде из коробки делает 4 пробела вместо таба.

Денис
26.03.2018
09:18:44
Если человек запушил с отступом в 2 таба - он прям сильно интересная личность, потому что в ~любом нормальном редакторе AFAIK ширина таба в пробелах выставляется в настройках

Bogdan
26.03.2018
09:24:17

Konstantine
26.03.2018
09:30:10

Bogdan
26.03.2018
09:31:15

Boris
26.03.2018
09:33:15
пробелы ты будешь использовать в любом случае, а вместе с табами будет непонятно проблемы это или табы, лучше путь всё будут пробелами

Kirill
26.03.2018
09:33:36

Boris
26.03.2018
09:34:43

Kirill
26.03.2018
09:35:58

Google

Boris
26.03.2018
09:36:30
это как не делать пустых строк в коде, сперто очень выглядит и мусорно

Mikhail
26.03.2018
10:54:29

Vitalii
26.03.2018
10:56:43

Boris
26.03.2018
10:58:23
Хотя скала в этом свою роль тоже сыграла ?

Konstantine
26.03.2018
11:01:10

Vitalii
26.03.2018
11:01:38

Alexey
26.03.2018
11:02:16
Давно не видил столько коментов про пробельчики ?

Bogdan
26.03.2018
11:13:45
может в оффтоп

Albert
26.03.2018
11:15:42

Mikhail
26.03.2018
11:25:04

Alexey
26.03.2018
11:26:31

Ivan
26.03.2018
12:31:42
Привет. Решил сделать немного магии с помощью Kotlin Compiler Plugins API. Идея такая, найти в датаклассах автоматически сгинеренные ф-ции и добавить им аннотацию. Взял SyntheticResolveExtension. Получил список функций синтетических, осталось добавить аннотацию, и на этом этапе я застрял. Как я понимаю просто изменить объект Annotations нельзя и нужно вызовом SimpleFunctionDescriptorImpl.create создать новый класс и засунуть в него уже модифицированный Annotations. Из коробки у Annotations есть несколько статиков среди которых EMPTY и еще парочка функий,которые мне не очень подходят. Вопрос вот в чем, как мне создать новый объект Annotations с нужным мне типом аннотации?
и если кто-то знает где найти док на компиляторные кишки
буду очень благодарен

Vladimir
26.03.2018
12:45:05

Ivan
26.03.2018
12:45:29
ну апи для плагинов вроде открытый же

Vladimir
26.03.2018
12:47:07
ну апи для плагинов вроде открытый же
Ну вот здесь говорят обратное (но ситуация могла измениться)
https://www.reddit.com/r/Kotlin/comments/7hoytl/kotlin_team_ama_ask_us_anything/dqsryql/

Leonid
26.03.2018
12:48:03

Google

Ivan
26.03.2018
12:49:34
ну вот есть такой занятный модуль https://github.com/JetBrains/kotlin/tree/master/compiler/plugin-api

Gennady
26.03.2018
12:56:38
Товарищи, я новичок в программировании. Сейчас пытаюсь реализовать Leaderboard гугловый в своем приложении. Все туториалы, что я смогу найти, старые и про 2014 год. Может у кого-то есть пример реализации? Рабочий кусок кода. Спасибо и извините за глупый новичковый вопрос :)

Oleg
26.03.2018
12:56:57

Руслан
26.03.2018
12:59:52
Это грустное хаха или веселое? Там все так плохо что сразу нашли баг после релиза, причем настолько тупой: https://twitter.com/tagir_valeev/status/976351563961831425


Ivan
26.03.2018
13:00:08
Всем привет. Вопрос по красивому оформлению лямбд. Есть такая шняга:
fun <T>.replaceIf(condition: Boolean, mapper: (T) -> T): T = if (condition) mapper(this) else this
Я захотел её каррировать, чтобы сначала передать предикат (а не уже вычисленный результат в виде Boolean), а потом вызывать маппер. Получилось следующее:
fun <T> T.replaceIf(predicate: (T) -> Boolean): ((T) -> T) -> T = { mapper: (T) -> T -> replaceIf(predicate(this)) { mutator(this) } }
Вопрос следующий - я так понимаю, красиво вызвать это теперь в одну строчку, опуская круглые скобки, уже не получится? Компилятор съедает только следующее:
someValue.replaceIf { somePredicate(it) } ({ it.someModification() })
Т.е. несмотря на то, что мне возвращается функция, принимающая единственный аргумент, другую функцию, я не могу сразу вызвать её, опустив круглые скобки? Хотелось бы чего-нибудь типа:
someValue.replaceIf { somePredicate(it) } { it.someModification() }

Oleg
26.03.2018
13:00:46

Руслан
26.03.2018
13:02:27
я в том плане что " а у нас var уже есть")
Ну Java var вообще тяжело без слез сравнивать с Котлиновским. Там только для локальных переменных и при этом еще и с доп ограничениями, типо нельзя array сделать var. Ну и визуально тупее сделан, просто по инициализатору (правой части).
С учетом как это все протестировали (судя по тому же багу выше) боюсь что этот var еще наделает беды в Java

Vladimir
26.03.2018
13:08:52
final var.
Этим всё сказано.

Roman
26.03.2018
13:09:56
Хватит гнобить дедушку, он еще могет! :)
Где-то был доклад почему они так сделали. Не помню точно, но вроде как потому что иначе оно сильно много чего ломает.


Andrew
26.03.2018
13:24:46
Всем привет. Вопрос по красивому оформлению лямбд. Есть такая шняга:
fun <T>.replaceIf(condition: Boolean, mapper: (T) -> T): T = if (condition) mapper(this) else this
Я захотел её каррировать, чтобы сначала передать предикат (а не уже вычисленный результат в виде Boolean), а потом вызывать маппер. Получилось следующее:
fun <T> T.replaceIf(predicate: (T) -> Boolean): ((T) -> T) -> T = { mapper: (T) -> T -> replaceIf(predicate(this)) { mutator(this) } }
Вопрос следующий - я так понимаю, красиво вызвать это теперь в одну строчку, опуская круглые скобки, уже не получится? Компилятор съедает только следующее:
someValue.replaceIf { somePredicate(it) } ({ it.someModification() })
Т.е. несмотря на то, что мне возвращается функция, принимающая единственный аргумент, другую функцию, я не могу сразу вызвать её, опустив круглые скобки? Хотелось бы чего-нибудь типа:
someValue.replaceIf { somePredicate(it) } { it.someModification() }
Вот такое ещё разве что завелось:
5.replaceIf { true } () { it * 2 }
А вообще нельзя, да — передать таким образом можно ровно одну лямбду, и две подряд даже с каррированием всё равно являются синтаксической ошибкой.
По мне это хорошо, ибо читать такое было бы не особо просто.


Boris
26.03.2018
13:32:54
Может инфикс можно как то прикрутить?

Ivan
26.03.2018
14:01:30
Долго думал. В итоге изобрел функциональную композицию:
infix fun <T,R> (((T) -> R) -> R).forwardCompose(mapper: (T) -> R) = invoke(mapper)
someVal.replaceIf { true } forwardCompose { it * 2 }
Но чтобы прямо вообще ничего между блоками не ставить не выходит. Хотя что забавно, IDE это сделать предлагает, и даже не подсвечивает как ошибку потом, но не компилируется)

Andrew
26.03.2018
14:07:49
> Хотя что забавно, IDE это сделать предлагает, и даже не подсвечивает как ошибку потом, но не компилируется)
Звучит как повод сходить в kotl.in/issue :)

Vyacheslav
26.03.2018
14:52:00
ребят а что в котлине нельзя перегрузить конструктор ?

Andrew
26.03.2018
14:53:49

Vyacheslav
26.03.2018
14:54:30
тьфу не докрутил колесико как раз до этого
сори

Google

Vyacheslav
26.03.2018
14:54:54
facepalm

Andrew
26.03.2018
14:55:20
Читай статью целиком, в том числе о том, как работают блоки init { ... }, ибо это не самая очевидная штука в языке.

Vyacheslav
26.03.2018
14:56:26
окей спасибо)

Антон
26.03.2018
20:21:21
Ребят, если яву не особо учил, нужно сначала ее, а потом уже котлин?)

Konstantin
26.03.2018
20:25:01
Интересно, сколько человек ещё задаст этот вопрос...

Антон
26.03.2018
20:28:26
Это уже беда

Bogdan
26.03.2018
20:29:14

Антон
26.03.2018
20:31:02
окей, но чисто на практике разработки под андроид, чем котлин интереснее?

Malik
26.03.2018
20:31:03
Конечно нет, можешь спокойно начать учить kotlin, не зная Java.

Жабра
26.03.2018
20:31:26
Подскажите, как лучше сделать: есть глобальная переменная currentUser: User, которая содержит данные о пользователе, который залогинился на данный момент. Когда пользователь разлогинится - надо занулить переменную. Как обойтись без вездесущего !!
?

Mayor
26.03.2018
20:32:32
кто такой вездесущий?

Malik
26.03.2018
20:32:57
Он!!

Жабра
26.03.2018
20:33:23

Konstantin
26.03.2018
20:33:26

Жабра
26.03.2018
20:33:51

Malik
26.03.2018
20:34:52
Может задать ей параметр, который говорит о том, есть там значение или нет?)

Жабра
26.03.2018
20:35:49

Igor
26.03.2018
20:35:57

Жабра
26.03.2018
20:36:42

Google

Владислав
26.03.2018
20:38:37
Может проще завезти обычную переменную авторизован/не авторизован?

Жабра
26.03.2018
20:41:57

Владислав
26.03.2018
20:42:27
Ну в смысле, ты же точно знаешь авторизован ты или нет?

Жабра
26.03.2018
20:43:48

Владислав
26.03.2018
20:44:25
Ну, какие-то данные у тебя всегда есть, каких-то нет, можешь значения какие-нибудь по умолчанию задать

Жабра
26.03.2018
20:45:49

Владислав
26.03.2018
20:46:59
Блин, ну сделай синглтон с юзером, который никогда не null, получай спокойно нужные данные когда хочешь

Жабра
26.03.2018
20:49:06
Сейчас прибежит @Harmonizr и ударит по рукам за такие советы. :D (синглтон с зависимостями)

Владислав
26.03.2018
20:50:00
¯\_(ツ)_/¯

balolam
26.03.2018
20:52:39
Еще бы за вопросы кто бил по рукам

Egor
26.03.2018
21:35:08
А котлин компилит код через джаву или напрямую в байт-код?

Igor
26.03.2018
21:36:10
В байткод конечно

Egor
26.03.2018
21:39:23
Просто если декомпилить его в джаву - нормальный код получается, вот и проверял, может он и в байт-код через кодогенератор джавы проходит