Ruby find_all vs select, o co jde?

Před měsícem jsem o programovacím jazyku Ruby nevěděl vůbec nic. Zrovna jsem dělal pohovor pomocí Javascriptu pro Flatiron School, kde se učí Javascript I Ruby. Rychlý posun vpřed a teď se toho nemůžu nabažit!

Přijetí na Flatiron School byl jen začátek. Krátce poté následovalo sto hodin přípravné práce v Ruby, kde jsme se naučili spoustu metod Ruby, které budeme potřebovat k vytváření funkčních aplikací.

Z těchto metod v Ruby pro mě vynikaly metody find_all a select, protože se zdálo, že dosahují stejné věci. Počáteční průzkum mě přivedl k nalezení…

find_all

select

Počkejte, nejsou identické!?

No, tak trochu. Hlubší ponor do dokumentace Ruby mě přivedl ke zjištění, že pod kapotou je toho trochu víc.

Objekt je vyjmenovatelný, pokud popisuje množinu položek a metodu pro procházení každé z nich. V Ruby jsou Enumerable#find_all a Enumerable#select stejný kód. Pole v Ruby dědí z Enumerable, takže spuštění find_all nebo select na poli v Ruby přinese stejný výsledek.

Ale začíná to být komplikované, když děláte smyčku nad hashem. Haš je kolekce dvojic klíč-hodnota. Pokud znáte spíše Javascript, hash v Ruby je jako objekt v Javascriptu.

**Na hashi find_all vrací pole**

hash = {a: 1, b: 2, c: 3, d: 4}hash.find_all do |key, value|
value.odd?
end#would return , ] because the find_all method is #inherited from Enumerable

**Na hashi select vrací hash místo pole**

hash = {a: 1, b: 2, c: 3, d: 4}hash.select do |key, value|
value.odd?
end#would return {a:1, c:3}

Proč tedy find_all a select dávají při spuštění nad hashem různé výsledky? U hashe find_all stále dědí od Enumerable, ale select je předefinován tak, aby vracel hash místo pole. Jemný, ale důležitý rozdíl!

Morálka příběhu: než použijete select nebo find_all (a vlastně jakoukoli metodu v softwarovém inženýrství), přemýšlejte o tom, co chcete vrátit!

Já to zvládli!

.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.