/ / Come rendere questa creazione di hash più carina - rubino

Come rendere questa creazione di hash più bella - rubino

Mi stavo chiedendo se c'è un modo più elegante di scrivere le seguenti righe:

section_event_hash = []
sections.each do |s|
section_event_hash << { s => s.find_all_events }
end

Voglio creare un hash le cui chiavi sono gli elementi di sectionse i valori sono matrici di elementi restituiti da find_all_events metodo.

risposte:

1 per risposta № 1

Il codice che hai postato non sta facendo esattamente quello che hai detto che vuoi. Diamo un'occhiata più da vicino testando in questo modo:

sections = ["ab", "12"]

section_event_hash = []
sections.each do |s|
section_event_hash << { s => s.split("") }
end

puts section_event_hash.inspect

dà:

[{"ab"=>["a", "b"]}, {"12"=>["1", "2"]}]

Quindi hai effettivamente creato una serie di hash, in cui ogni hash contiene una coppia chiave-valore.

Il seguente codice produce un hash conpiù elementi. Nota come viene creato un hash vuoto con {} anziché []. Le parentesi graffe sono il simbolo di un hash, mentre le parentesi quadre si riferiscono a una particolare chiave.

section_event_hash = {}
sections.each do |s|
section_event_hash[s] = s.split("")
end

puts section_event_hash.inspect

=> {"ab"=>["a", "b"], "12"=>["1", "2"]}

Per quanto riguarda un modo "più elegante" di farlo, benequesto dipende dalla tua definizione. Come dimostrano le altre risposte qui riportate, di solito c'è più di un modo per fare qualcosa in ruby. seph "s produce la stessa struttura dati del tuo codice originale, mentre mu produce l'hash che descrivi. Personalmente, miravo solo a un codice che fosse facile da leggere, capire e mantenere.


3 per risposta № 2

Se vuoi section_event_hash per essere davvero un Hash piuttosto che un array, allora potresti usare each_with_object:

section_event_hash = sections.each_with_object({}) { |s, h| h[s] = s.find_all_events }

Potresti usare map per costruire una serie di array e quindi alimentarli Hash[]:

section_event_hash = Hash[sections.map { |s| [s, s.find_all_events] }]

0 per risposta № 3
array_of_section_event_hashes = sections.map do |s|
{s => s.find_all_events}
end