Skip to content

Instantly share code, notes, and snippets.

@vkuznetsov
Last active August 29, 2015 14:01
Show Gist options
  • Save vkuznetsov/45adfe870464a2542b67 to your computer and use it in GitHub Desktop.
Save vkuznetsov/45adfe870464a2542b67 to your computer and use it in GitHub Desktop.
задание практическое
# Представим, что у нас есть некоторый внешний источник, который возвращает нам данные в виде массива хэшей, причем все значения в хэше - строки. Нам нужно написать много разных преобразователей, которые выполняют преобразование переданных данных по заданным правилам.
# Создайте такой модуль Converter, который позволит создавать такие классы-преобразователи:
# Пример преобразователя:
class Transactions
extend Converter
attrb :uid # значение будет передаваться как есть без преобразования
attrb :sum, :to_f # для преобразования значения будет вызван его(значения) метод to_f '50.25'.to_f
# для преобразования значения будет вызван блок, который принимает исходное значение и возвращает преобразованное
attrb :timestamp do |value|
Time.parse(value)
end
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
module Converter
# ваша реализация
# нужно реализовать метод attrb, который запоминает правила трансформации для каждого атрибута
end
# для проверки вашего модуля Storage я могу создать любой другой класс:
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