Прошло уже около двух месяцев с выхода интерпретатора языка программирования ruby версии 1.9. Вторая нечётная цифра здесь, как и у многих других open source проектов, означает нестабильную, экспериментальную версию, способ опробовать «wild and weird ideas». Ниже приведён краткий обзор этих экспериментальных изменений с точки зрения человека хорошо знакомого с предыдущими версиями. Выбор для обзора ограничен не их важностью (очень важная вещь — улучшенная поддержка юникода, например, пропущена), а интересом, которые они вызвали у автора.
Примечания: под словом блок ниже понимается как Proc, так и lambda, поскольку тонкие различия не играют роли в этом кратком обзоре, использование «
вместо
Возможность отмечена как «VERY EXPERIMENTAL», одна из самых спорных идей, и, действительно, при использовании в большом объёме может давать трудно читаемый код.
в дополнении к двум старым способам:
Способ более краткий чем 1 и более очевидный чем 2, и, на мой взгляд, стоит включения в стабильную версию.
Параметры блоков отныне локальны (для меня, наверное, самые частые грабли в руби). Теперь такое (код для 1.8) не повториться:
Значение
У
Идея хорошо согласуется с общей идеологией ruby, отменяет необходимость в специальных методах вроде
К Time добавилось семь новых способов, очень хорошо соответствующих стилю ruby. Попробуйте угадать каких — для знающих руби не должно составить труда.
Аналогично к Integer добавились методы
Логичное продолжения для языка содержащего методы
Symbol по умолчанию работает теперь конвертируется в блок. Сейчас можно написать:
Такое, впрочем, можно было сделать и в старых версиях, но с дополнительным библиотечным кодом.
Повторюсь, что это был обзор экспериментальной версии ruby, отзывы по которой во многом определят версию 2.0. Планируется, что она будет быстрее, меньше, безопаснее, проще для встраивания в другие приложения.
Изменений было произведено намного больше, здесь можно ознакомиться с подробным описанием.
Изменения в синтаксисе и семантике
Примечания: под словом блок ниже понимается как 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. Планируется, что она будет быстрее, меньше, безопаснее, проще для встраивания в другие приложения.
Изменений было произведено намного больше, здесь можно ознакомиться с подробным описанием.