Articles

metoda injectării: explicată

astăzi, aruncăm o privire asupra metodei de injectare a lui Ruby (#inject). Ca oricine care este destul de departe de-a lungul călătoriei lor pentru a afla mai multe despre codificare, știi limbi sunt umplute cu confuz, minunat metode și funcții. Recent, am dat peste una dintre aceste confuze și, după cum am învățat, metode minunate, injectați. Am încercat să rezum o serie de numere întregi și am crezut în mod eronat că ruby are o metodă nativă #sum, dar nu are un astfel de noroc. Deci, am ajuns la googling și am găsit # inject.

metoda #inject acționează la fel ca metoda #reduce și sunt considerate pseudonime. Aceste metode enumerator poate lua o gamă sau o serie de numere, și poate primi opțional un bloc. Când este apelată, metoda inject va trece fiecare element și va acumula fiecare secvențial.

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

sau

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

pentru a descompune acest lucru și mai mult, inject ia primul element din colecția dvs. și îl folosește ca „sumă” de bază. Apoi ia următorul element (sau al doilea element din matrice) și apoi le adaugă împreună. Metoda atribuie apoi acel rezultat sumei și adaugă următorul element din colecție până când toate elementele au fost trecute prin bloc. În acest caz, suma este ceea ce numim un acumulator — deoarece acumulează valorile. Valoarea returnată va fi suma tuturor elementelor din colecție.

această metodă este curioasă, deoarece îi puteți transmite și o valoare implicită pentru acumulator. Vezi mai jos:

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

aici, dați metodei o valoare de pornire pentru acumulator, deoarece am trecut-o la zero, metoda va adăuga primul element al colecției la zero înainte de a trece la adăugarea celui de-al doilea și al treilea element din colecție.

acum, că știm cum să adăugăm valori din colecții… să explorăm celelalte aplicații ale #inject.

hash-uri de construcție:

#Inject poate fi foarte puternic în afara adăugării valorilor împreună. Să presupunem că aveți date sau o valoare returnată care este o matrice de matrice care conțin chei și valori (adică , ]). Cel mai probabil veți dori ca acestea să fie cheie: perechi de valori într-un hash. Inject vă poate ajuta foarte rapid și elegant să faceți acest lucru.

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

în acest exemplu începem cu o serie de matrice care conțin perechi de chei și valori. Când apelăm injectați și treceți într-un argument al unui hash gol, care va acționa ca acumulator (sau în acest caz ‘rezultat’). Apoi metoda iterează prin fiecare element și îl injectează în hash folosind blocul furnizat. Blocul atribuie elementul cheie, care vine mai întâi, ca cheie în noul hash și stabilește valoarea egală cu al doilea element din matricea imbricată. Un alt lucru de remarcat aici este că valoarea returnată a inject este următorul rezultat dat (de obicei suma numerelor întregi). Deoarece vrem hash-ul nostru, trebuie să returnăm în mod explicit hash-ul rezultat.

în plus, inject poate fi folosit pentru a converti tipuri de date cu ajutorul unor alte metode interesante — chiar și în timp ce este construirea unui nou 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 nu se oprește totuși aici. De asemenea, poate filtra și construi o nouă matrice!

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

aici trecem injectați o valoare inițială a unui tablou gol. Primul element dintre / / va fi întotdeauna rezultatul sau acumulatorul din bloc. Deci, odată ce rezultatul este setat egal cu o matrice goală, putem lopata în orice element care trece filtrul nostru, în acest caz, dacă elementul este mai mare decât 9. Din nou, deoarece valoarea returnată a inject este următorul rezultat dat, trebuie să returnăm în mod explicit rezultatul.