Что нового в Ruby 1.9?
ноября 20, 2010 | Published in Ruby, Основы | 4 Comments
В этой статье автор пытается раскрыть все наиболее значительные изменения в Ruby 1.9.
Изменения в самом Ruby:
— Rubygems и Rake теперь официально являются частями Ruby и поставляются с ним в комплекте.
— Некоторые непопулярные библиотеки были исключены из ядра, однако доступны в виде RubyGems: soap, jruby и т.д.
— Новый «основной» класс в иерархии классов: BasicObject:
1.8 => [Class, Module, Object, Kernel]
1.9 => [Class, Module, Object, Kernel, BasicObject]
BasicObject.instance_methods # => [:==, :equal?, :!, :!=, :instance_eval, :instance_exec, :__send__]
Этот класс на столько основной, что для него даже не определен метод object_id.
Цепочки методов
В Ruby, наверное, больше чем в других языках используется стиль написания цепочек методов. Заботясь об улучшениях этого стиля, разработчики Ruby добавили в Ruby 1.9 новый метод .tap (который кроме того был портирован и в Ruby 1.8):
puts "Rubydev".reverse .tap{ |o| puts "reversed: #{o}" } .upcase # => reversed: vedybuR # => VEDYBUR
В интернетах есть несколько статей посвященных только этому одному методу, но все, что вам необходимо знать о нем — это то, что .tap позволяет сделать с объектом что-то, прежде, чем объект перейдет в пользование к следующему методу.
Символы:
Символы теперь интерпретируются регулярными выражениями как строки:
a = [:windows, :mac, :amiga] puts a.grep(/ac/) # 1.8 => [] # 1.9 => mac
Мы также можем получить из символа Proc:
u = :upcase.to_proc u.call('lorem ipsum...') # => LOREM IPSUM...
Массивы:
— Метод to_a больше не принадлежит классу Object.
— Массивы могут создаваться с помощью омонимного класса: a = Array ['apple', 'bananas']. Это сделано с целью улучшить читабельность кода.
— Оператор * имеет более логическое поведение.
Хэши:
— Теперь хэши, наконец-то, стали стабильными структурами данных. Элементы удерживают порядок вставки.
— Новый синтаксис определения пары ключь — значение с использованием симоволов.
#Вместо: h = {:jan => 200, :feb => 210, :mar => 235} #мы можем использовать: h = {jan: 200, feb: 210, mar: 235}
— Простой доступ из строки:
#Вместо: puts "First two months of this year was: #{h[:jan]} and #{h[:feb]}" #... теперь можно так: puts "First two months of this year was: %{jan} and %{feb}" % h
— Метод .to_s теперь, по сути, является синонимом метода .inspect: возвращает внутреннюю структуру хэша в понятном человеку виде.
— Метод .select теперь возвращает не массив массивов, а хэш:
h = {ukraine: 45, russia: 150, usa: 230, china: 1200 } puts h.select{|k, v| v > 100} #=> {:russia=>150, :usa=>230, :china=>1200} puts h.select{|k, v| k.to_s > 's'} #=> {:ukraine=>45, :usa=>230}
Блоки:
— Блоки и методы используют один и тот же синтаксис для передачи параметров во внутрь. Однако для блоков поспела маленькая правка: теперь все переменные в блоках кода являются локальными из-за чего не происходит столкновения с переменными из внешнего мира.
foo = 'blah blah' # это внешняя переменная bar = 23 5.times do |foo| bar += foo # а здесь foo - это внутренняя переменная puts bar #bar - внешняя переменная используемая внутри контекста блока end puts foo # => blah blah puts bar # => 33
Ruby Fibers
Мы видим значительный рост интереса к параллелизму и технике написания многопоточных программ. Об этом можно судить по распространению таких языков, как Clojure и Erlang. Ruby начиная с версии 1.9 обретает отличный программерский инструмент — Fibers (в пер. Волокна).
Ruby Fibers — легковесный процесс занимающий в памяти всего 4кб задуманный для совместного параллелизма. Мы можем представлять себе Fibers как процедуры (Proc), которые поддерживают статус по вызову.
fb = Fiber.new do |val| Fiber.yield "That's all... (#{val})" Fiber.yield "folks! (#{val})" end puts fb.resume 10 #... puts fb.resume 20
Автор: ,
Оригинал на английском здесь:
ноября 20, 2010 at 14:52 (#)
Большое спасибо за перевод. Познавательно.
ноября 20, 2010 at 20:39 (#)
Исправте в тексте орфографические ошибки, так же обычные ляпы, например «какстроки».
ноября 20, 2010 at 21:12 (#)
Dmitry, спасибо, поправил.
ноября 20, 2010 at 21:55 (#)
Исправь
на
Автору оригинала я уже отписал.