Articles

Iniettare Metodo: ha Spiegato

Oggi, stiamo prendendo uno sguardo a Ruby iniettare metodo (#iniettare). Come chiunque sia abbastanza lontano nel loro viaggio per saperne di più sulla codifica, sai che le lingue sono piene di metodi e funzioni confusi e fantastici. Recentemente, mi sono imbattuto in uno di questi metodi confusi e, come ho imparato, fantastici, iniettare. Stavo cercando di sommare una serie di numeri interi e pensavo erroneamente che ruby avesse un metodo #sum nativo, ma nessuna fortuna. Quindi, ho avuto modo di googlare e ho trovato # inject.

Il metodo #inject agisce come il metodo #reduce e sono considerati alias. Questi metodi di enumeratore possono assumere un intervallo o una matrice di numeri e possono facoltativamente ricevere un blocco. Quando viene chiamato, il metodo inject passerà ogni elemento e accumulerà ciascuno in sequenza.

.inject(:+) => (((3 + 6) + 10) + 13) => 32

O

.inject {|sum, number| sum + number} =>|3, 6| 3 + 6 => 9
=>|9, 10| 9 + 10 =>19

Per scomporre ulteriormente questo, inject prende il primo elemento della tua collezione e lo usa come ‘somma’di base. Prende quindi l’elemento successivo (o il secondo elemento nell’array) e quindi li aggiunge insieme. Il metodo assegna quindi quel risultato alla ‘somma’ e aggiunge l’elemento successivo nella raccolta fino a quando tutti gli elementi sono stati passati attraverso il blocco. In questo caso, ‘ sum ‘ è ciò che chiamiamo un accumulatore — poiché sta accumulando i valori. Il valore restituito sarà la somma di tutti gli elementi della raccolta.

Questo metodo è curioso perché puoi anche passargli un valore predefinito per l’accumulatore. Vedi sotto:

.inject(0, :+) => 32.inject(0) {|sum, number| sum + number} => 19

Qui, stai dando al metodo un valore iniziale per l’accumulatore, poiché l’ho passato a zero, il metodo aggiungerà il primo elemento della raccolta a zero prima di passare all’aggiunta del secondo e del terzo elemento nella raccolta.

Ora che sappiamo come aggiungere i valori da collezioni… Esploriamo le altre applicazioni di #iniettare.

Costruire hash:

#Inject può essere molto potente al di fuori dell’aggiunta di valori insieme. Diciamo che hai dati o un valore restituito che è un array di array che contengono chiavi e valori (cioè , ]). Molto probabilmente vorrai che quelle siano coppie chiave: valore in un hash. Iniettare può molto rapidamente ed elegantemente aiutare a ottenere che fatto.

, ].inject({}) do |result, element| 
result = element.last
result
end
#=> {:student=>"Terrance Koar", :course=>"Web Dev"}

In questo esempio iniziamo con un array di array contenenti coppie chiave e valore. Quando chiamiamo inject e passiamo in un argomento di un hash vuoto, che fungerà da accumulatore (o in questo caso ‘risultato’). Quindi il metodo scorre attraverso ogni elemento e lo inietta nell’hash usando il blocco fornito. Il blocco assegna l’elemento chiave, che viene prima, come chiave nel nuovo hash e imposta il valore uguale al secondo elemento nell’array nidificato. Un’altra cosa da notare qui è che il valore restituito di inject è il prossimo risultato prodotto (in genere la somma di numeri interi). Dal momento che vogliamo il nostro hash, dobbiamo restituire esplicitamente l’hash “risultato”.

Inoltre, inject può essere utilizzato per convertire i tipi di dati con l’aiuto di altri metodi interessanti, anche mentre sta costruendo un nuovo hash!

, ].inject({}) do |result, element| 
result = element.last.upcase
result
end
# => {"student"=>"TERRANCE KOAR", "course"=>"WEB DEV"}OR, ].inject({}) do |result, element|
result = element.last.split
result
end# => {"student"=>, "course"=>}

Inject non si ferma qui però. Può anche filtrare e costruire un nuovo array!

.inject() do |result, element| 
result << element.to_s if element > 9
result
end# =>

Qui stiamo passando iniettare un valore iniziale di un array vuoto. Il primo elemento tra | / sarà sempre il “risultato” o l’accumulatore nel blocco. Quindi, una volta che il risultato è impostato uguale a un array vuoto, possiamo spalare in qualsiasi elemento che passa il nostro filtro, in questo caso se l’elemento è maggiore di 9. Ancora una volta, poiché il valore restituito di inject è il prossimo risultato ottenuto, dobbiamo restituire esplicitamente il risultato.