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 sections
e i valori sono matrici di elementi restituiti da find_all_events
metodo.
risposte:
1 per risposta № 1Il 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