/ / Vrátenie indexu s hodnotou pri použití metódy each_with_index - rubín

Vracia index s hodnotou pri použití metódy each_with_index - rubín

Stavba základného adresára v Ruby.Mám v mojom programe nasledujúci riadok kódu, ktorý iteruje cez existujúce pole (@address_book) na základe štandardného číselného vstupu (entrynumber), aby zodpovedal indexu poľa. Výsledná hodnota, ktorá sa zhoduje s týmto indexom, sa potom vráti. Tu je príslušný kód:

     puts @address_book.entries.each_with_index.select {|val, i| i == (entrynumber - 1)}

výsledky vyzerajú skvele, až na to, že index sa tiež vracia naspodok, napríklad takto: (poznámka 0 na konci návratu) Ideálne by sa mi páčilo samotné číslo indexu, ktoré sa nevráti.

View by Entry Number
Entry Number: 1
You picked 1
Name: adam adams
Phone Number: 111-111-1111
Email: aa@aa.com
0

Čo mi chýba z hľadiska vrátenia hodnoty, ale bez indexu?

odpovede:

2 pre odpoveď č. 1

Problém je v tom, že each_with_index sa obracia @address_book.entries do poľa polí. Tu je príklad toho, čo mám na mysli:

["a", "b"].each_with_index.to_a
# => [["a", 0], ["b", 1]]

Keď sa teda prihlásite select na each_with_index, každý z vybraných prvkov bude pole s prvkom a jeho indexom:

["a", "b"].each_with_index.select { |e, i| i == 1 }
=> [["b", 1]]

Zlá oprava

Mohli by ste to opraviť pomocou #map na výber iba prvého prvku každého vybratého riadku:

["a", "b"].each_with_index.select { |e, i| i == 1 }.map(&:first)
=> ["b"]

Pomocou select.with_index

Ešte lepšie je použiť select.with_index:

["a", "b"].select.with_index { |e, i| i == 1}
=> ["b"]

Alebo v prípade vášho kódu:

@address_book.entries.
each_with_index.select.with_index {|val, i| i == (entrynumber - 1)}

Použitie poľa č. []

ak @address_book.entries je pole, potom môžete indexovať pole, nepoužíva vôbec výber:

@address_book_entries[entrynumber - 1]

Ak nejde o pole, môžete ho zmeniť na jedno pomocou #to_a:

@address_book.entries.to_a[entrynumber - 1]

Ak je však adresa @ address_book.entries veľká, mohlo by to spotrebovať veľa pamäte. Pri premene výčtu na pole postupujte opatrne.


0 pre odpoveď č. 2

Zdá sa, že chcete, aby ste dostali jednu položku, ktorá naozaj nie je čo select je najvhodnejšie pre (najmä keď ho načítate pomocou indexu. Pravdepodobne by som urobil niečo ako:

@address_book.entries.to_a[entrynumber - 1]