5 przykładów najlepszego wykorzystania Rubiego
Czy kiedykolwiek zastanawiałeś się, co możemy zrobić z Ruby? Cóż, niebo jest prawdopodobnie granicą, ale chętnie porozmawiamy o kilku mniej lub bardziej znanych przypadkach...
Przeczytaj artykuł naszego eksperta Ruby i dowiedz się, dlaczego nie musisz zawsze używać tego hasha.
Kiedy chcemy zagregować jakieś rzeczy, bardzo często używamy #each_with_object lub rozszerzyć regularne pętla przy użyciu #with_object. Ale w większości przypadków Ruby deweloperzy używają zwykłego hasha jako agregatora i być może jest to w porządku, ale w tym artykule chciałbym pokazać, że nie zawsze musi to być hash.
Zakładamy, że wszystkie pliki są umieszczone w jednym katalogu (ludzie).
Załóżmy, że mamy następujące dane people/people.csv file:
Imię, Nazwisko, Wiek
John,Doe,24
Jane,Dee,45
Josh,Bee,55
Andrea,Boya,34
Andrew,Moore,54
Chcemy znaleźć sumę wierszy i średni wiek - możemy napisać następujący skrypt:
people/parser.rb
require 'csv'
aggregated = CSV.foreach('people.csv', headers: true)
.withobject({ total: 0, totalage: 0 }) do |row, agg|
agg[:total] += 1
agg[:totalage] += row['Age'].toi
end
total = aggregated[:total]
averageage = aggregated[:totalage].to_f / total
puts "Łącznie: #{łącznie}"
puts "Średni wiek: #{średni_wiek}"
I tak, robi to, ale czytanie takiego kod to wątpliwa przyjemność. To zbyt niski poziom. Możemy to poprawić, dostarczając dedykowany agregator dla pętla.
people/age_aggregator.rb
class AgeAggregator
attrreader :total, :totalage
def initialize
@total = 0
@total_age = 0
end
def increment!
@total += 1
end
def incrementage!(age)
@totalage += age
end
def averageage
totalage.to_f / total
end
end
Wtedy nasza pętla wyglądałaby jak poniżej:
people/parser.rb
require 'csv'
requirerelative './ageaggregator.rb'
aggregated = CSV.foreach('people.csv', headers: true)
.withobject(AgeAggregator.new) do |row, agg|
agg.increment!
agg.incrementage!(row['Age'].to_i)
end
puts "Łącznie: #{aggregated.total}"
puts "Średni wiek: #{aggregated.average_age}"
Myślę, że jest to o wiele jaśniejsze.
Napisaliśmy więcej kodu, ale nasze szczegóły niższego poziomu zostały wyodrębnione do osobnej klasy. Teraz główny skrypt czyta się znacznie lepiej.
Of course, you can argue that the example is too simple to put so much effort into refactoring, but c’mon – it’s just an example ;). If you had to aggregate more dane, such aggregator objects are really the way to rescue.

Czytaj więcej:
Plusy i minusy tworzenia oprogramowania w Ruby