-
-
Save vkuznetsov/45adfe870464a2542b67 to your computer and use it in GitHub Desktop.
задание практическое
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Представим, что у нас есть некоторый внешний источник, который возвращает нам данные в виде массива хэшей, причем все значения в хэше - строки. Нам нужно написать много разных преобразователей, которые выполняют преобразование переданных данных по заданным правилам. | |
# Создайте такой модуль 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