Pull to refresh

Эмоциональный обзор Ruby 1.9

Reading time2 min
Views2.6K
Прошло уже около двух месяцев с выхода интерпретатора языка программирования ruby версии 1.9. Вторая нечётная цифра здесь, как и у многих других open source проектов, означает нестабильную, экспериментальную версию, способ опробовать «wild and weird ideas». Ниже приведён краткий обзор этих экспериментальных изменений с точки зрения человека хорошо знакомого с предыдущими версиями. Выбор для обзора ограничен не их важностью (очень важная вещь — улучшенная поддержка юникода, например, пропущена), а интересом, которые они вызвали у автора.

Изменения в синтаксисе и семантике


Примечания: под словом блок ниже понимается как Proc, так и lambda, поскольку тонкие различия не играют роли в этом кратком обзоре, использование «=>» не является частью языка, а означает результат, который вернула последняя конструкция

Новый способ записи блоков


fun = ->(a, b){ a + b }

вместо

fun = lambda{|a,b| a + b }

Возможность отмечена как «VERY EXPERIMENTAL», одна из самых спорных идей, и, действительно, при использовании в большом объёме может давать трудно читаемый код.

Новый способ вызова блоков


fun.(2,5)

в дополнении к двум старым способам:
fun.call(2,5) # 1
fun[2,5] # 2

Способ более краткий чем 1 и более очевидный чем 2, и, на мой взгляд, стоит включения в стабильную версию.

Параметры блоков


Параметры блоков отныне локальны (для меня, наверное, самые частые грабли в руби). Теперь такое (код для 1.8) не повториться:
i = 42
10.times{|i| puts i }
i
=> 10

Значение i останется 42. Это изменение означает несовместимость с 1.8, но скорее всего будет принято в стабильную версию.

Новые методы


with_index


У Enumerator-а появился очень полезный метод with_index, позволяющий преобразовать его в другой Enumerator выполняющий тоже действие, но также передающий дополнительный аргумент — индекс. Например, следующий код выбирает из массива каждый третий элемент:
[1,3,4,6,5,6].select.with_index{|v,i| (i+1)%3 == 0 }
=> [4, 6]

Идея хорошо согласуется с общей идеологией ruby, отменяет необходимость в специальных методах вроде each_with_index. Это позволяет отказаться от дополнительной переменной цикла и сделать код проще и безопаснее.

Мелочи для Time и Integer


К Time добавилось семь новых способов, очень хорошо соответствующих стилю ruby. Попробуйте угадать каких — для знающих руби не должно составить труда.
Time.now.sunday?
=> false
Time.now.thursday?
=> true

Аналогично к Integer добавились методы odd? и even?
1.odd?
=> true
3.even?
=> false

Логичное продолжения для языка содержащего методы nil? и zero?.

Symbol#to_proc


Symbol по умолчанию работает теперь конвертируется в блок. Сейчас можно написать:
["one", "two", "three"].map(&:capitalize)
=> ["One", "Two", "Three"]

Такое, впрочем, можно было сделать и в старых версиях, но с дополнительным библиотечным кодом.

Повторюсь, что это был обзор экспериментальной версии ruby, отзывы по которой во многом определят версию 2.0. Планируется, что она будет быстрее, меньше, безопаснее, проще для встраивания в другие приложения.

Изменений было произведено намного больше, здесь можно ознакомиться с подробным описанием.
Tags:
Hubs:
Total votes 31: ↑29 and ↓2+27
Comments78

Articles