Articles

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, variablenmemoher 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#reducereturnerer 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 sentenceer længere end den, der er gemt i memoså tildeler vi memo til at være sentence; ellers skal du bare returnere den samme værdi.

på denne måde opdateres vores memoværdien løbende med den længeresentenceog #inject#reducereturnerer det memovariabel 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.