Inject Metody: Vysvětlil
Dnes, jsme se podívat na Ruby inject metodu (#inject). Jako každý, kdo je na své cestě dost daleko, aby se dozvěděl více o kódování, víte, že jazyky jsou plné matoucích, úžasné metody a funkce. Nedávno jsem narazil na jednu z těchto matoucích, a jak jsem se naučil, úžasné metody, injekci. Snažil jsem se shrnout řadu celých čísel a mylně jsem si myslel, že ruby má nativní metodu # sum, ale žádné takové štěstí. Tak jsem se dostal na googling a našel # inject .
metoda # inject funguje stejně jako metoda # reduce a jsou považovány za aliasy. Tyto metody výčtu mohou mít rozsah nebo pole čísel a mohou volitelně přijímat blok. Při volání metoda injekce projde každým prvkem a hromadí se postupně.
.inject(:+) => (((3 + 6) + 10) + 13) => 32
NEBO
.inject {|sum, number| sum + number} =>|3, 6| 3 + 6 => 9
=>|9, 10| 9 + 10 =>19
zlomit to dolů ještě dále, aplikovat vezme první prvek v kolekci a používá to jako základ „součet“. Poté vezme další prvek (nebo druhý prvek v poli) a poté je přidá dohromady. Metoda pak přiřadí tento výsledek „součtu“ a přidá další prvek ve sbírce, dokud všechny prvky neprošly blokem. V tomto případě je „součet“ to, čemu říkáme akumulátor-protože hromadí hodnoty. Návratová hodnota bude součtem všech prvků ve sbírce.
tato metoda je zvědavá, protože můžete také předat výchozí hodnotu akumulátoru. Viz níže:
.inject(0, :+) => 32.inject(0) {|sum, number| sum + number} => 19
dáváte metoda výchozí hodnota pro akumulátor, od doby, co jsem přešel na nule, tato metoda přidá první prvek kolekce na nulu před přechodem na toho druhého a třetího prvky v kolekci.
Teď, když víme, jak přidat hodnoty z kolekce… Pojďme se podívat na další aplikace #inject.
Stavební hashe:
#Inject může být velmi silný mimo přidávání hodnot dohromady. Řekněme, že máte data nebo návratovou hodnotu, což je pole polí, která obsahují klíče a hodnoty (tj. S největší pravděpodobností budete chtít, aby to byly klíčové: páry hodnot v hash. Injekce vám může velmi rychle a elegantně pomoci.
, ].inject({}) do |result, element|
result = element.last
result
end
#=> {:student=>"Terrance Koar", :course=>"Web Dev"}
v tomto příkladu začneme s polem polí obsahujících páry klíčů a hodnot. Když zavoláme injekci a předat argument prázdné hash, který bude působit jako akumulátor(nebo v tomto případě „výsledek“). Poté metoda iteruje každý prvek a vstřikuje jej do hash pomocí poskytnutého bloku. Blok je přiřazení klíčovým prvkem, který přicházíš první, jako klíč v nové hash a nastavení na hodnotu rovnající se druhý prvek na vnořené pole. Další věc, kterou je třeba poznamenat, je, že návratová hodnota inject je další získaný výsledek(obvykle součet celých čísel). Protože chceme náš hash, musíme explicitně vrátit „výsledek“ hash.
navíc lze inject použít k převodu datových typů pomocí některých dalších skvělých metod-i když vytváří nový 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 tam však nekončí. Může také filtrovat a vytvářet nové pole!
.inject() do |result, element|
result << element.to_s if element > 9
result
end# =>
Tady jsme kolem inject počáteční hodnota prázdné pole. Prvním prvkem mezi / / bude vždy ‚výsledek‘ nebo akumulátor v bloku. Takže jakmile je výsledek nastaven na rovno prázdnému poli, můžeme lopatu v jakémkoli prvku, který prochází naším filtrem, v tomto případě, pokud je prvek větší než 9. Opět platí, že vzhledem k tomu, že návratová hodnota inject je dalším výsledkem, musíme výsledek explicitně vrátit.