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.