пʼятниця, 26 жовтня 2012 р.

Оголошено 'Feature Freeze' для Ruby 2.0

Точно за розкладом, основна команда Ruby оголосила про заморожування коду нових можливостей('feature freeze') майбутнього Ruby 2.0. Це означає, що з цього моменту розробники лише будуть виправляти баги, не додаючи нових фіч в дану версію.

Нижче я збираюся представити переклад статті "Things to Look Forward to in Ruby 2.0" у якій автор перерахував декілька нових можливостей Ruby 2.0.


Комбінація методів map/select

Ця можливість не ввійшла до Ruby 2.0 (прим. перекладача).
Припустимо, ви хочете виконати метод map для Enumerable і отримати тільки ті елементи, які відповідають певним критеріям.
Ви можете зробити це одним із цих двох способів:
[1,2,3,4].select(&:even?).map {|i| i + 1}
==> [3, 5]
[1,2,3,4].map { |i| i + 1 if i.even? }.compact
==> [3, 5]

Ідея полягає в тому, щоб мати один метод, який поєднує в собі ці два. Його ім'я до цих пір не визначене, але filter_map здається можливим вибором.
[1,2,3,4].filter_map { |i| i + 1 if i.even? }
==> [3, 5]

Так як я не хочу чекати, я вирішив зробити версію для бідних, але дати їй інше ім'я.
module Enumerable
  def map_selected(&block)
    map(&block).compact!
  end
end

[1,2,3,4].map_selected { |i| i + 1 if i.even? }
==> [3, 5]

Ruby feature #5663

Іменовані аргументи функцій

Мені їх не вистачає з тих пір, як я дізнався, що вони є в Smalltalk. Потім, на мій жах я зрозумів, що вони є в Lisp, Clojure і навіть в Python.

Звичайно, ви можете підробити іменовані аргументи за допомогою хешу, але приємніше мати  підтримку з коробки:
def foo_bar(name: 'foo', last_name: 'bar')
  print "#{name} #{last_name}"
end

foo_bar ==> foo bar
foo_bar last_name: 'baruco' ==> foo baruco
foo_bar last_name: 'baruco', name:'hello' ==> hello baruco

Ruby feature #5474
Ruby feature #5454 translation

Про іменовані аргументи функцій в Ruby 2.0 я раніше писав у цьому блозі.

Змінна екземпляру присвоюється об'єкту під час створення

Це частий випадок можна буде скоротити на два рядки:
class FooBar
  def initialize(name, last_name)
    @name = name
    @last_name = last_name
  end

  def to_s
    "#@name #@last_name"
  end
end

print FooBar.new('foobar', 'rulez')
=> foobar rulez

Ось так:
class FooBar
  def initialize(@name, @last_name)
    #nice isn't it?
  end

  def to_s
    "#@name #@last_name"
  end
end

print FooBar.new('foobar', 'rulez')
=> foobar rulez

Я впевнений, що будуть ситуації, коли така поведінка стане в нагоді. Функція йде від CoffeScript, наскільки я можу судити. Для Ruby 1.8.7 стане у нагоді наступний трюк:
define_method(:intialize){|@name, @last_name|}

Ruby feature #5825

>>> Оригінал статті

Не менш цікавою можливістю у новому Ruby є метод Enumerable#lazy, про який я писав у цьому блозі.
Докладніше про Enumerable#lazy: англійською і російською.

Про всі зміни які відбулися після 1.9.3 ви можете почитати тут. Їх небагато, і ваш код, написаний для 1.9.3 буде справно працювати і на 2.0.0.

Немає коментарів: