Mam skrót, który wygląda mniej więcej tak:
params = { :irrelevant => "A String",
:choice1 => "Oh look, another one",
:choice2 => "Even more strings",
:choice3 => "But wait",
:irrelevant2 => "The last string" }
I chcę prosty sposób na odrzucenie wszystkich kluczy, które nie są wyborem + int. Może to być wybór1 lub wybór1 poprzez wybór10. To się zmienia.
Jak wyróżnić klawisze, wybierając tylko słowo i cyfrę lub cyfry po nich?
Premia:
Zamień skrót w ciąg znaków z tabulatorem (\ t) jako separatorem. Zrobiłem to, ale wymagało to kilku wierszy kodu. Zazwyczaj mistrzowie Rubicy mogą to zrobić w jednym lub kilku wierszach.
Odpowiedzi:
Edytuj do oryginalnej odpowiedzi : Mimo że jest to odpowiedź (w momencie komentarza) jest wybraną odpowiedzią, oryginalna wersja tej odpowiedzi jest nieaktualna.
Dodam tutaj aktualizację, aby inni mogli uniknąć omijania tej odpowiedzi, tak jak ja.
Jak wspomniano w innej odpowiedzi, Ruby> = 2.5 dodał
Hash#slice
metodę, która wcześniej była dostępna tylko w Railsach.Przykład:
Koniec edycji. Poniżej znajduje się oryginalna odpowiedź, która, jak sądzę, będzie przydatna, jeśli korzystasz z Ruby <2,5 bez Railsów, chociaż wydaje mi się, że ta sprawa jest dość rzadka w tym momencie.
Jeśli używasz Ruby, możesz użyć tej
select
metody. Będziesz musiał przekonwertować klucz z symbolu na ciąg, aby wykonać dopasowanie wyrażenia regularnego. To da ci nowy Hash z wybranymi opcjami.lub możesz użyć
delete_if
i zmodyfikować istniejący hash nplub jeśli chodzi tylko o klucze, a nie o wartości, które chcesz, możesz:
a to da tylko tablicę kluczy np
[:choice1, :choice2, :choice3]
źródło
.select
jest.reject
, jeśli to czyni kod bardziej idiomatycznym.#slice
sposób działa dla mnie w wersji 2.5.3, nawet bez aktywnego wsparcia.W Ruby wybór Hash # jest właściwą opcją. Jeśli pracujesz z Railsami, możesz użyć Hash # slice i Hash # slice !. np. (szyny 3.2.13)
źródło
Najprostszym sposobem jest dołączenie
gem 'activesupport'
(lubgem 'active_support'
).Następnie w swojej klasie wystarczy
i zadzwonić
Uważam, że nie warto deklarować innych funkcji, które mogą zawierać błędy, i lepiej jest użyć metody, która została poprawiona w ciągu ostatnich kilku lat.
źródło
Najprostszym sposobem jest dołączenie klejnotu „activesupport” (lub klejnot „active_support”).
params.slice(:choice1, :choice2, :choice3)
źródło
Jeśli pracujesz z szynami i masz klucze na osobnej liście, możesz użyć
*
zapisu:Jak stwierdzono w innych odpowiedziach, możesz także użyć
slice!
do modyfikacji skrótu na miejscu (i zwrócenia skasowanego klucza / wartości).źródło
To jest jeden wiersz, aby rozwiązać pełne oryginalne pytanie:
Ale większość powyższych rozwiązań rozwiązuje przypadek, w którym musisz znać klucze z wyprzedzeniem, używając
slice
lub zwykłego wyrażenia regularnego.Oto inne podejście, które działa w przypadku prostych i bardziej złożonych przypadków użycia, które można wymieniać w czasie wykonywania
Teraz nie tylko pozwala to na bardziej złożoną logikę dopasowywania kluczy lub wartości, ale jest również łatwiejsze do testowania i można zamienić pasującą logikę w czasie wykonywania.
Ex, aby rozwiązać pierwotny problem:
źródło
Z
Hash::select
:źródło
Jeśli chcesz pozostały skrót:
lub jeśli chcesz tylko klucze:
źródło
Umieść to w inicjalizatorze
To możesz zrobić
lub
źródło
źródło
Co do pytania bonusowego:
Jeśli masz dane wyjściowe z
#select
metody takiej jak ta (lista tablic 2-elementowych):następnie po prostu weź ten wynik i wykonaj:
Jeśli masz dane wyjściowe z
#delete_if
metody takiej jak ta (skrót):następnie:
źródło
map
przyjmuje blok jako argument. Możesz tworzyć bloki w locie, z&:method
konstrukcją, która tworzy blok{|v| v.method }
. W moim przypadku&:last
wywołano argument tablica (tablica 2-elementowa). Jeśli chcesz się nim bawić, najpierw sprawdź, jaki argument otrzymujesz w bloku (zdobądź 1 argument, nie dekonstruuj go na wiele argumentów!) I spróbuj znaleźć 1 metodę (nie możesz połączyć metod&:method
), która zwróci ci to, co masz chcieć. Jeśli to możliwe, możesz użyć skrótu, jeśli nie, potrzebujesz pełnego blokuźródło
Miałem podobny problem, w moim przypadku rozwiązaniem było jedno-liniowe działanie, nawet jeśli klucze nie są symbolami, ale musisz mieć klucze kryteriów w tablicy
Inny przykład
źródło