5 exempel på hur Ruby används på bästa sätt
Har du någonsin undrat vad vi kan göra med Ruby? Tja, himlen är förmodligen gränsen, men vi är glada att prata om några mer eller mindre kända fall ...
Läs en artikel från vår Ruby Expert och lär dig varför du inte behöver alltid youse hash.
När vi vill sammanställa vissa saker använder vi ofta 1TP61Undervisa_med_föremål
eller förlänga den ordinarie Loop med hjälp av #med_föremål
. Men i de flesta fall Ruby-utvecklare använder en vanlig hash som aggregat och kanske är det bra, men i den här artikeln vill jag visa dig att det inte alltid behöver vara en hash.
Vi antar att alla filer är placerade i en katalog (människor
).
Låt oss säga att vi har följande människor/människor.csv
file:
Förnamn,Efternamn,Ålder
John,Doe,24
Jane,Dee,45
Josh,Bee,55
Andrea,Boya,34
Andrew,Moore,54
Vi vill ta reda på det totala antalet rader och medelåldern - vi kan skriva följande skript:
människor/parser.rb
kräver 'csv'
aggregerad = CSV.foreach('people.csv', rubriker: true)
.withobject({ total: 0, totalage: 0 }) do |row, agg|
agg[:total] += 1
agg[:totalage] += rad['Ålder'].toi
slut
total = aggregerad[:total]
averageage = aggregerad[:totalage].to_f / total
puts "Total: #{total}"
puts "Genomsnittlig ålder: #{genomsnittlig_ålder}"
Och ja, det gör saken men att läsa en sådan kod är ett tveksamt nöje. Det känns som en för låg nivå. Vi kan förbättra den genom att tillhandahålla en dedikerad aggregator för Loop.
människor/ålder_aggregator.rb
klass AgeAggregator
attrreader :total, :totalage
def initialisera
@total = 0
@total_ålder = 0
slut
def inkrementering!
@total += 1
slut
def inkrementering!(ålder)
@totalage += ålder
slut
def genomsnitt
totalage.to_f / total
slut
slut
Och då skulle vår loop se ut som nedan:
människor/parser.rb
kräver 'csv'
kravrelativ './ageaggregator.rb'
aggregerad = CSV.foreach('people.csv', headers: true)
.withobject(AgeAggregator.new) do |row, agg|
agg.ökning!
agg.incrementage!(rad['Ålder'].to_i)
slut
puts "Totalt: #{aggregated.total}"
puts "Medelålder: #{aggregated.average_age}"
Jag tycker att det är mycket tydligare.
Vi har skrivit mer kod, men våra detaljer på lägre nivå extraheras till den separata klassen. Nu läses huvudskriptet mycket bättre.
Naturligtvis kan du hävda att exemplet är för enkelt för att lägga så mycket ansträngning på refaktorisering, men kom igen - det är bara ett exempel ;). Om du skulle behöva aggregera mer data är sådana aggregatorobjekt verkligen vägen till räddning.
Läs mer om detta: