Mam to:
hash = { "a"=>["a", "b", "c"], "b"=>["b", "c"] }
i chcę do tego dojść: [["a","b","c"],["b","c"]]
Wygląda na to, że powinno działać, ale tak nie jest:
hash.each{|key,value| value}
=> {"a"=>["a", "b", "c"], "b"=>["b", "c"]}
Jakieś sugestie?
hash.values
będąc lepszą IMO). Ale chciałem zwrócić uwagę, że gdy podasz blok, poHash#each
prostu zwróci pełną wartość skrótu. Jeśli chcesz wykonać operację na każdym elemencie i zwrócić to jako tablicę, użyjHash#collect
lub jego aliasuHash#map
. Więcej informacji o Enumerables tutaj .Odpowiedzi:
Również trochę prostsze ....
Dokument Ruby tutaj
źródło
map
), bo bardzo mi się to podoba!Hash#values
jest nie tylko prostszy, ale i wydajniejszy. Porównajtime ruby -e '(1..1000000).reduce({}){|h,i| h.store i,i; h}.values'
ztime ruby -e '(1..1000000).reduce({}){|h,i| h.store i,i; h}.map{|k,v| v}'
Użyłbym:
źródło
Hash#values
.Enumerable#collect
przyjmuje blok i zwraca tablicę wyników wykonania bloku raz dla każdego elementu wyliczalnego. Więc ten kod po prostu ignoruje klucze i zwraca tablicę wszystkich wartości.Enumerable
Moduł jest dość niesamowite. Znajomość tego może zaoszczędzić mnóstwo czasu i mnóstwo kodu.źródło
hash.values
jest ostatecznie poprawną odpowiedzią tutaj.hash.map(&:second)
:)źródło
To jest tak proste, jak
zwróci to nową tablicę wypełnioną wartościami z skrótu
jeśli chcesz zapisać tę nową tablicę, zrób to
źródło
Jest też ten:
Dlaczego to działa:
&
Zwracato_proc
się na obiekcie, i przekazuje je jako blok do sposobu.źródło