https://kotlinlang.org logo
#russian
Title
# russian
s

sannysanoff

04/17/2017, 10:17 AM
Я ж правильно понимаю, что оно семантически эквивалентно: named@for(a in arr) { ... continue@named ... } и arr.forEach lam@{ a-> ... return @lam ... } ?
e

elizarov

04/17/2017, 10:18 AM
Да
s

sannysanoff

04/17/2017, 10:19 AM
Ок, будем ковырять, спасибо.
e

elizarov

04/17/2017, 10:19 AM
А чтобы имитировать break, нужно завести именованную лямбду вокруг цикла.
s

sannysanoff

04/17/2017, 10:22 AM
Эти замечания кстати наталкивают на буквальную реализацию в компиляторе, генерить неявные лямбды в соответствующих местах, заменять break/continue на соотв вызовы, а оптимизатор уже выоптимизит неиспользуемое.
e

elizarov

04/17/2017, 10:22 AM
Да реализовать это может и не так сложно. Тут же всё вопрос в приоритетах и вообще юзкейсах. Экзотическая это весьма нужда
Если есть интересные юзкейсы — добавляйте в issue.
s

sannysanoff

04/17/2017, 10:25 AM
Ну вот я писал на жабе много кода, и эти случаи, использование continue с выходом из вложенных synchronized, они у меня повсюду, потому что одним словом как бы делается сразу много, и keywords с "сильной" фактической нагрузкой делают программу на жабе короче, что и хорошо, и естественно стремится быть использованным чаще. Вот такой вот кейс.
e

elizarov

04/17/2017, 10:28 AM
Вложенные synchronized это очень плохой smell. Увеличение абстрации (extract method/function refactoring и т.п.) спасет отца русской демократии.
o

orangy

04/17/2017, 10:39 AM
Вложенные synchronized вытащенные в функции усложняют слежение за порядком захвата блокировок…
s

sannysanoff

04/17/2017, 10:43 AM
Усложняет. А что облегчает слежение за порядком блокировок вообще? Только бдительность.
Вот у меня есть мелкие объекты, которые входят в состав многих коротких мапов (индексов). На входе код объекта. Я лочусь на мапе, и потом на объекте, когда там его найду, потом его мутирую там или что еще. Такой вот паттерн доступа. Если зарефакторить, то вместо вложенного continue@ придется мудрить возвращать что-то еще дополнительно, n'est-ce pas?
Ага, это был ответ Ильи Роману, а я не распарсил
o

orangy

04/17/2017, 11:02 AM
Ну можно использовать более другие структуры данных, которые подходят для конкурентной работы.
s

sannysanoff

04/17/2017, 12:35 PM
ConcurrentHashMap например, но там действие происходит в лямбде, откуда break точно не сделаешь.
3 Views