5 näidet Ruby parimast kasutamisest
Kas olete kunagi mõelnud, mida me saame teha Ruby'ga? Noh, taevas on ilmselt piirideta, kuid me räägime hea meelega mõnest rohkem või vähem teadaolevast juhtumist...

Lugege meie Ruby Expert'i artiklit ja saate teada, miks te ei pea alati youse hash.
Kui me tahame koondada midagi, kasutame väga sageli #each_with_object_object
või pikendada tavalist loop kasutades #with_object
. Kuid enamasti Ruby arendajad kasutavad agregaatorina tavalist hash'i ja võib-olla on see hea, kuid selles artiklis tahaksin teile näidata, et see ei pea alati olema hash.
Eeldame, et kõik failid on paigutatud ühte kataloogi (inimesed
).
Oletame, et meil on järgmine people/people.csv
file:
Eesnimi,Perekonnanimi,Vanus
John,Doe,24
Jane,Dee,45
Josh,Bee,55
Andrea,Boya,34
Andrew,Moore,54
Me tahame leida ridade kogusumma ja keskmise vanuse - me võiksime kirjutada järgmise skripti:
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 = agregeeritud[:total]
averageage = aggregated[:totalage].to_f / total
puts "Total: #{total}"
puts "Keskmine vanus: #{average_age}"
Ja jah, see teeb asja, kuid lugedes sellist kood on kahtlane rõõm. See tundub liiga madalal tasemel. Me saame seda parandada, pakkudes spetsiaalset agregaatorit loop.
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
Ja siis näeb meie tsükkel välja nagu allpool:
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 "Kokku: #{aggregated.total}"
puts "Keskmine vanus: #{aggregated.average_age}"
Ma arvan, et see on palju selgem.
Oleme kirjutanud rohkem koodi, kuid meie madalama taseme detailid on eraldatud eraldi klassi. Nüüd loeb põhiskript palju paremini.
Loomulikult võite väita, et näide on liiga lihtne, et nii palju vaeva näha ümbertöötlemisega, kuid see on ju ainult näide ;). Kui sul oleks vaja rohkem andmeid agregeerida, siis on sellised agregaatorobjektid tõesti päästevahend.
Loe edasi:
Ruby tarkvaraarenduse plussid ja miinused