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ď č. 1Problé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]