Нижче я збираюся представити переклад статті "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.
Немає коментарів:
Дописати коментар