Что нового в Ruby 1.9?

ноября 20, 2010  |  Published in Ruby, Основы  |  4 Comments

Что нового в 1.9?В этой статье автор пытается раскрыть все наиболее значительные изменения в 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

Автор: Carlo Pecchia,
Оригинал на английском здесь: Do you know what’s new in Ruby 1.9?

Tags: ,

Responses

  1. rezwyi says:

    ноября 20, 2010 at 14:52 (#)

    Большое спасибо за перевод. Познавательно.

  2. Dmitry says:

    ноября 20, 2010 at 20:39 (#)

    Исправте в тексте орфографические ошибки, так же обычные ляпы, например «какстроки».

  3. admin says:

    ноября 20, 2010 at 21:12 (#)

    Dmitry, спасибо, поправил.

  4. dre3k says:

    ноября 20, 2010 at 21:55 (#)

    Исправь

    a = Array(['apple', 'bananas'])
    

    на

    a = Array['apple', 'bananas']
    

    Автору оригинала я уже отписал.

Leave a Response

Для подсветки кода используйте BB - коды: [language]...[/language], где language может быть: ruby, javascript, css, html.