понедельник, 7 января 2013 г.

Вкусные лямбды и коллекции в Scala

Изучая язык, приятно находить в нём вкусные плюшки. Безусловно, выбор языка определяется его применимостью к поставленной задаче. Но когда условия задачи не очень жёсткие (например, если делается уютная маленькая программка для себя или пишется диплом), то и такие вещи играют роль.

Долгое время эталоном вкусного языка для меня являлся исключительно Ruby. Его динамичность вплоть до добавления новых методов в рантайме позволяет создавать потрясающие DSL и писать всякие человеко-читаемые вещи вроде Time.now + 3.hours или c.format(100).should == '$ 100', не говоря уже о встроенных в язык приятных сладостях вроде однострочных концевых условий (parts.reverse! unless self.postfix?) и возможности опускать ненужные скобки.

Остальные языки, которые я знал, оставались по вкусности далекоо-далеко позади. Конечно, это не было трагедией. Я не однобокий человек и, любя Ruby, спокойно писал диплом и работал в UGENE на C++. Но на C++ я никогда не стал бы писать для души: оскомину набьёт быстро.

Начав изучать Scala, я с радостью обнаружил, что тут тоже много вкусностей, но до рубишных они не дотягивали: да, тоже можно делать так-то, но на Ruby всё равно вышло бы красивее.

Но все же в Scala есть такое место, где она может быть лаконичнее и красивее даже чем Ruby! Это цепочки коротких действий (map, filter, foreach) над коллекциями или, в общем случае, итераторами.