Articles

injektálási módszer: magyarázat

ma megnézzük a Ruby injekciós módszerét (#injekció). Mint bárki, aki elég messze van ahhoz, hogy többet tudjon meg a kódolásról, tudod, hogy a nyelvek tele vannak zavaros, félelmetes módszerekkel és funkciókkal. Nemrég találkoztam egy ilyen zavaros, és mint megtanultam, félelmetes módszerek, injekció. Egész számok tömbjét próbáltam összegezni, és tévesen azt gondoltam, hogy Rubynak natív # sum metódusa van, de nem volt ilyen szerencséje. Így, gugliztam, és megtaláltam az #inject-et.

a #inject metódus ugyanúgy működik, mint a #reduce metódus, és álneveknek tekintik őket. Ezek a számlálómódszerek egy számtartományt vagy tömböt vehetnek fel, és opcionálisan egy blokkot is kaphatnak. Amikor meghívják, az injektálási módszer minden elemet átmegy, és egymás után felhalmozódik.

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

vagy

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

ennek további lebontásához az inject a gyűjtemény első elemét veszi fel, és ezt használja alap “összegként”. Ezután felveszi a következő elemet (vagy a tömb második elemét), majd összeadja őket. Ezután a metódus hozzárendeli ezt az eredményt a ‘sum’ – hoz, majd hozzáadja a gyűjtemény következő eleméhez, amíg az összes elem át nem halad a blokkon. Ebben az esetben az ‘összeg’ az, amit akkumulátornak nevezünk — mivel felhalmozza az értékeket. A visszatérési érték a gyűjtemény összes elemének összege lesz.

Ez a módszer azért érdekes, mert az akkumulátor alapértelmezett értékét is átadhatja. Lásd alább:

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

itt az akkumulátor kiindulási értékét adja meg a módszernek, mivel nullát adtam át, a módszer a gyűjtemény első elemét nullára adja, mielőtt továbblépne a gyűjtemény második és harmadik elemének hozzáadására.

most, hogy tudjuk, hogyan adhatunk hozzá értékeket a gyűjteményekből… fedezzük fel a #inject többi alkalmazását.

Building hash:

#az Inject nagyon erős lehet az értékek összeadásán kívül. Tegyük fel, hogy van adat vagy visszatérési érték, amely kulcsokat és értékeket tartalmazó tömbök tömbje (azaz ]). Valószínűleg azt akarja, hogy ezek kulcsfontosságúak legyenek: értékpárok egy hash-ban. Az injekció nagyon gyorsan és elegánsan segít Önnek ebben.

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

ebben a példában kulcs-és értékpárokat tartalmazó tömbök tömbjével kezdjük. Amikor meghívjuk inject and pass egy üres hash argumentumában, amely akkumulátorként (vagy ebben az esetben ‘eredmény’) fog működni. Ezután a módszer minden elemen keresztül iterálódik, és a megadott blokk segítségével befecskendezi a hash-ba. A blokk hozzárendeli az első kulcselemet az új hash kulcsaként, és beállítja az értéket a beágyazott tömb második elemével. Egy másik dolog, amit itt meg kell jegyezni, hogy az injekció visszatérési értéke a következő eredmény (általában az egész számok összege). Mivel a hash-t akarjuk, kifejezetten vissza kell adnunk az ‘eredmény’ hash-t.

ezenkívül az inject felhasználható adattípusok konvertálására más hűvös módszerek segítségével-még akkor is, ha új hash-t épít!

, ].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"=>}

az injekció nem áll meg itt. Azt is szűrni és építeni egy új tömb!

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

itt egy üres tömb kezdeti értékét adjuk be. A || közötti első elem mindig az ‘eredmény’ vagy az akkumulátor lesz a blokkban. Tehát, ha az eredmény egyenlő egy üres tömbbel, akkor bármilyen elembe lapátolhatunk, amely áthalad a szűrőnkön, ebben az esetben, ha az elem nagyobb, mint 9. Ismét, mivel az inject visszatérési értéke a következő eredmény, kifejezetten vissza kell adnunk az eredményt.