forståelse af Rubys # inject / # reducer enumerable metoder på under 5 minutter
for at starte tager denne metode et array og to argumenter, når de er defineret. Dette kan visualiseres som følgende:
.inject { |memo, value|
#more lines of code here
}.reduce { |memo, value|
#more lines of code here
}
for at bemærke, variablenmemo
her kaldes memo
for at stå for hukommelse. Denne variabel er vigtig, fordi den gemmer, hvilke data du vil have denne metode til at huske, mens den krydser hele arrayet, men den kan navngives alt, hvad du vil, da det bare er en variabel.
Jeg vil henvise til det sommemo
i hele denne forklaring.
memo
kan gives en startværdi, men det er ikke nødvendigt at have en. Hvis en startværdi ikke er defineret, tager memo
den første værdi af arrayet.
### The starting value for memo is 5
.inject(5) { |memo, value|
#more lines of code here
}
### The starting value for memo is 1 (first value of the array)
.reduce { |memo, value|
#more lines of code here
}
#inject
#reduce
returnerer altid et enkelt dataobjekt — dataene memo
holder i slutningen. Når det er sagt, memo
skal ændres og returneres, da det bliver sløjfet, ellers forbliver det på samme værdi.
nu hvor vi fik semantikken nede, vil jeg gennemgå nogle eksempler, da jeg fandt #inject
#reduce
nyttigt.
eksempel 1: brug af #inject/#reducer til at anvende en numerisk operation
den mest almindelige måde at bruge denne metode på er, når du får en række heltal, og du skal anvende en numerisk handling på hele arrayet. I dette eksempel vil jeg vise, hvordan man finder summen af et helt array.
#inject
#reduce
, vil blive illustreret som sådan:
.reduce { |memo, value|
memo += value
} ## The following is to illustrate how this method was traversed
~> 1 += 2 #memo returns 3
~> 3 += 3 #memo returns 6
~> 6 += 4 #memo returns 10
~> 10 += 5 #memo returns 15#=> 15
da dette er en ret almindelig måde at bruge #inject
#reduce
, der er en stenografisk metode, du kan bruge, hvis du bare vil anvende en numerisk handling i hele dit array ved at angive det på følgende måde:
## This is for product, with no initial value stated
.inject(:*)
#=> 120 ### This is for sum, with an initial value of 5
.reduce(5, :+)
#=> 20
eksempel 2: Brug #inject/ #reducer for at finde den længste streng
i dette eksempel skal du sige, at du får en række strenge, og du skal finde den længste streng i det array.
i dette tilfælde #inject
#reduce
vises som sådan:
sentences = sentences.inject{ |memo, sentence|
if memo.size < sentence.size
memo = sentence
else
memo
end
}
#=> "There are jumping lizards on the fountain"
for at nedbryde dette: da vi ikke initialiserer memo
med en værdi, det vil tage det første objekt i arrayet, sentences
i dette eksempel. Inde i vores metode har vi enif
erklæring, der bare sammenligner voresmemo
længde til hversentence
længde.
dette if
erklæring er hvor magien sker: hvis en sentence
er længere end den, der er gemt i memo
så tildeler vi memo til at være sentence
; ellers skal du bare returnere den samme værdi.
på denne måde opdateres vores memo
værdien løbende med den længeresentence
og #inject
#reduce
returnerer det memo
variabel i sidste ende.
Hvis du vil se hvert trin illustreret, kan du køre dette i Repl.it at se for dig selv.
sentences = sentences.inject { |memo, sentence|
puts "Memo length is: #{memo.length}\nSentence length is: #{sentence.length}"
if memo.length < sentence.length
puts "Our sentence is longer"
memo = sentence
else
puts "Our memo is longer"
memo
end
puts "Our memo is: #{memo}\n \n"
memo
}
eksempel # 3: Brug af # inject/ # reducer for at finde det mest gentagne tal i et array
nu hvor vi øvede på at bruge denne metode på forskellige måder, lad os lave et lignende eksempel. Sig, at du får en tilfældig række tal, og du vil finde ud af, hvilket nummer der gentages mere.
i dette tilfælde kan du bruge#inject
#reduce
som så:
numbers = numbers.reduce { |memo, number|
if numbers.count(memo) <= numbers.count(number)
memo = number
else
memo
end
}
nu ligner denne logik det, vi gjorde i Eksempel 2, den eneste forskel er i vores if-erklæring, vi bruger#count
på vores oprindelige array for at finde og gemme, hvilken værdi der har et større eller lige antal. På denne måde returneres vi kun det nummer, der har det største antal i sidste ende.