Jaki jest (najszybszy / najczystszy / prosty) sposób konwersji wszystkich kluczy w haszu z ciągów znaków na symbole w Rubim?
Przydałoby się to podczas analizowania YAML.
my_hash = YAML.load_file('yml')
Chciałbym móc użyć:
my_hash[:key]
Zamiast:
my_hash['key']
hash.symbolize_keys
ihash.deep_symbolize_keys
wykonaj pracę, jeśli używasz Railsów.Odpowiedzi:
W Ruby> = 2.5 ( dokumenty ) możesz użyć:
Używasz starszej wersji Ruby? Oto linijka, która skopiuje skrót do nowego z symbolami kluczy:
Z Railsami możesz używać:
źródło
each_with_object
tak:my_hash.each_with_object({}){|(k,v), h| h[k.to_sym] = v}
.tap
metody, aby usunąć potrzebę zaliczeniamemo
na końcu. Stworzyłem oczyszczoną wersję wszystkich rozwiązań (także rekurencyjnych) gist.github.com/Integralist/9503099Oto lepsza metoda, jeśli używasz Railsów:
parametry. symbolize_keys
Koniec.
Jeśli nie, po prostu oderwij ich kod (znajduje się również w linku):
źródło
symbolize_keys
na nowy i działający (Rails 3) adres URL. Pierwotnie właśnie poprawiłem adres URLto_options
, ale pod tym linkiem nie ma żadnej dokumentacji.symbolize_keys
faktycznie ma opis, więc użyłem go zamiast tego.hash.stringify_keys
działa.W konkretnym przypadku YAML w Ruby, jeśli klawisze zaczynają się od „
:
”, zostaną automatycznie internowane jako symbole.Wynik:
źródło
YAML#load_file
domyślnych wszystkich klawiszy symboli zamiast ciągów bez konieczności rozpoczynania każdego klawisza dwukropkiem?Jeszcze bardziej zwięzłe:
źródło
my_hash.map { |k, v| [k.to_sym, v] }.to_h
jeśli używasz Railsów, jest to o wiele prostsze - możesz użyć HashWithIndifferentAccess i uzyskać dostęp do kluczy zarówno jako String, jak i Symbole:
Zobacz też:
http://api.rubyonrails.org/classes/ActiveSupport/HashWithIndifferentAccess.html
Możesz też użyć niesamowitego klejnotu „Facets of Ruby”, który zawiera wiele rozszerzeń klas Ruby Core i bibliotek standardowych.
patrz także: http://rubyworks.github.io/rubyfaux/?doc=http://rubyworks.github.io/facets/docs/facets-2.9.3/core.json#api-class-Hash
źródło
Ponieważ
Ruby 2.5.0
możesz użyćHash#transform_keys
lubHash#transform_keys!
.źródło
stringify_keys
lubsymbolize_keys
.http://api.rubyonrails.org/classes/Hash.html#method-i-symbolize_keys
źródło
Oto sposób na głęboką symbolizację obiektu
źródło
Naprawdę lubię klejnot Mash .
możesz zrobić
mash['key']
, lubmash[:key]
, lubmash.key
źródło
Jeśli używasz jsona i chcesz go używać jako skrótu, w rdzeniu Ruby możesz to zrobić:
symbolize_names : Jeśli ustawione na true, zwraca symbole dla nazw (kluczy) w obiekcie JSON. W przeciwnym razie zwracane są łańcuchy. Ciągi są domyślne.
Doc: Json # parsuj symbolize_names
źródło
symbol_hash = JSON.parse(JSON.generate(YAML.safe_load(FILENAME)), symbolize_names: true)
jest dość SUCHYM (ale nieefektywnym) sposobem szybkiego uzyskania skrótu z zagnieżdżonymi kluczami jako symbolami, jeśli pochodzi z pliku YAML.params.symbolize_keys
będzie również działać. Ta metoda zamienia klucze skrótu w symbole i zwraca nowy skrót.źródło
Modyfikacja odpowiedzi @igorsales
źródło
W Railsach możesz użyć:
Konwertuje na:
źródło
deep_symbolize_keys
jest dodany w rozszerzeniu Hash Rails , ale nie jest częścią rdzenia Ruby.Tyle odpowiedzi tutaj, ale jedną z funkcji jest szyna
hash.symbolize_keys
źródło
To moja jedyna wkładka do zagnieżdżonych skrótów
źródło
W przypadku, gdy powodem trzeba to zrobić, ponieważ dane pochodzi z JSON, można pominąć żadnej z tego parsowania po prostu przechodząc w
:symbolize_names
opcji po spożyciu JSON.Nie wymaga Railsów i działa z Ruby> 1.9
źródło
Możesz być leniwy i owinąć to
lambda
:Ale działałoby to tylko do czytania z hasza - nie do pisania.
Aby to zrobić, możesz użyć
Hash#merge
Blok inicjujący dokona konwersji kluczy jeden raz na żądanie, ale jeśli zaktualizujesz wartość wersji ciągu klucza po uzyskaniu dostępu do wersji symbolu, wersja symbolu nie zostanie zaktualizowana.
Możliwe, że blok inicjujący nie zaktualizuje skrótu, co uchroni Cię przed tego rodzaju błędem, ale nadal będziesz narażony na działanie przeciwne - aktualizacja wersji symbolu nie zaktualizuje wersji łańcuchowej:
Dlatego należy zachować ostrożność przy przełączaniu między tymi dwoma kluczowymi formami. Trzymaj się jednego.
źródło
Czy coś podobnego do poniższej pracy?
Skopiuje skrót, ale przez większość czasu nie będziesz się tym przejmować. Prawdopodobnie istnieje sposób, aby to zrobić bez kopiowania wszystkich danych.
źródło
krótszy jednowarstwowy fwiw:
źródło
Co powiesz na to:
źródło
To jest dla osób, które używają
mruby
i nie mająsymbolize_keys
zdefiniowanej żadnej metody:Metoda:
String
RuntimeError
źródło
!
insymbolize_keys
. W przeciwnym razie działa dobrze.Tablica, którą chcemy zmienić.
strings = [„HTML”, „CSS”, „JavaScript”, „Python”, „Ruby”]
Utwórz nową zmienną jako pustą tablicę, abyśmy mogli „.pchować” symbole.
symbole = []
Tutaj definiujemy metodę z blokiem.
strings.each {| x | symbols.push (x.intern)}
Koniec kodu.
Jest to więc prawdopodobnie najprostszy sposób na konwersję ciągów znaków na symbole w tablicy (ach) w Rubim. Utwórz tablicę ciągów, a następnie utwórz nową zmienną i ustaw zmienną na pustą tablicę. Następnie wybierz każdy element w pierwszej tablicy utworzonej za pomocą metody „.each”. Następnie użyj kodu blokowego do „.push” wszystkich elementów w nowej tablicy i użyj „.intern lub .to_sym”, aby przekonwertować wszystkie elementy na symbole.
Symbole są szybsze, ponieważ oszczędzają więcej pamięci w kodzie i można ich użyć tylko raz. Symbole są najczęściej używane dla kluczy w skrócie, co jest świetne. Nie jestem najlepszym programistą ruby, ale ta forma kodu bardzo mi pomogła. Jeśli ktoś zna lepszy sposób, proszę udostępnić i możesz użyć tej metody do mieszania!
źródło
Jeśli chcesz rozwiązanie waniliowo-rubinowe, a ponieważ nie mam dostępu do tego
ActiveSupport
miejsca, głęboko symbolizuj rozwiązanie (bardzo podobne do poprzednich)źródło
Począwszy od wersji Psych 3.0 możesz dodać opcję symbolize_names:
Psych.load("---\n foo: bar") # => {"foo"=>"bar"}
Psych.load("---\n foo: bar", symbolize_names: true) # => {:foo=>"bar"}
Uwaga: jeśli masz wersję Psych niższą niż 3.0,
symbolize_names:
zostanie po cichu zignorowana.Moje Ubuntu 18.04 zawiera go po wyjęciu z pudełka z ruby 2.5.1p57
źródło
źródło
a
nawiasy kwadratowe, aby rozłożyć argument blokowy i uczynić go jeszcze bardziej zwięzłym. Zobacz na przykład moją odpowiedź.To nie jest dokładnie jedna linijka, ale zamienia wszystkie klucze ciągów w symbole, także te zagnieżdżone:
źródło
Podoba mi się ten liner, gdy nie używam Railsów, ponieważ wtedy nie muszę tworzyć drugiego skrótu i przechowywać dwóch zestawów danych podczas jego przetwarzania:
Hash # delete zwraca wartość usuniętego klucza
źródło
Dobra funkcja Facets 'Hash # deep_rekey jest również dobrą opcją, szczególnie:
Próba:
źródło
W ruby uważam, że jest to najprostszy i najłatwiejszy do zrozumienia sposób na przekształcenie skrótów klawiszowych w skróty na symbole:
Dla każdego klucza w skrócie wywołujemy na nim delete, który usuwa go z skrótu (również delete zwraca wartość powiązaną z kluczem, który został usunięty) i natychmiast ustawiamy to na wartość klucza symbolizowanego.
źródło
Podobne do poprzednich rozwiązań, ale napisane nieco inaczej.
Kod nie mutuje hasha, który został przekazany.
źródło