Skip to content

Instantly share code, notes, and snippets.

@yesnik
Last active August 29, 2015 14:11
Show Gist options
  • Save yesnik/e99b200662aecd78145d to your computer and use it in GitHub Desktop.
Save yesnik/e99b200662aecd78145d to your computer and use it in GitHub Desktop.
Задание по Ruby 1
=begin
Представим, что у нас есть некоторый внешний источник,
который возвращает нам данные в виде массива хэшей, причем все значения в хэше - строки.
Нам нужно написать много разных преобразователей, которые выполняют преобразование
переданных данных по заданным правилам.
=end
# Создайте такой модуль Converter, который позволит создавать такие классы-преобразователи:
# Пример преобразователя:
class Transactions
extend Converter
attrb :uid # значение будет передаваться как есть без преобразования
attrb :sum, :to_f # для преобразования значения будет вызван его(значения) метод to_f '50.25'.to_f
# для преобразования значения будет вызван блок,
# который принимает исходное значение и возвращает преобразованное
attrb (:timestamp) { |value| Time.parse(value) }
end
transactions = Transactions.new([
# входной массив хэшей где все значения - строки
{:uid => 'HT150', :sum => '50.25', :timestamp => '2014-04-04 05:50'},
{:uid => 'HT151', :sum => '119.63', :timestamp => '2014-04-04 06:18'}
])
# Значения преобразованы согласно правилам преобразованиия, описанным в Transactions
transactions.to_a
# => [{:uid=>"HT150", :sum=>50.25, :timestamp=>2014-04-04 05:50:00 +0600},
# {:uid=>"HT151", :sum=>119.63, :timestamp=>2014-04-04 06:18:00 +0600}]
transactions.first # => {:uid=>"HT150", :sum=>50.25, :timestamp=>2014-04-04 05:50:00 +0600}
transactions.select { |tx| tx[:sum] > 100 }
# => [{:uid => 'HT151', :sum => 119.63, :timestamp => 2014-04-04 06:18:00 +0600}]
transactions.sum # => 169.88
class Converter
# ваша реализация
# нужно реализовать метод attrb, который запоминает правила трансформации для каждого атрибута
end
# для проверки вашего модуля Converter я могу создать любой другой класс:
class People
extend Converter
attrb :name
attrb :height, :to_i
attrb :birthday do |value|
Date.parse(value)
end
end
# Он должен будет работать так:
ppl = People.new([{:name => 'Vlas', :height => '205', :birthday => '1990-08-08'}])
ppl.first # => {:name => 'Vlas', :height => 205, :birthday => Wed, 08 Aug 1990}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment