Ho un valore map
che modifica un valore o lo imposta su zero. Voglio quindi rimuovere le voci zero dall'elenco. Non è necessario conservare l'elenco.
Questo è quello che ho attualmente:
# A simple example function, which returns a value or nil
def transform(n)
rand > 0.5 ? n * 10 : nil }
end
items.map! { |x| transform(x) } # [1, 2, 3, 4, 5] => [10, nil, 30, 40, nil]
items.reject! { |x| x.nil? } # [10, nil, 30, 40, nil] => [10, 30, 40]
Sono consapevole che potrei semplicemente fare un ciclo e raccogliere condizionatamente in un altro array come questo:
new_items = []
items.each do |x|
x = transform(x)
new_items.append(x) unless x.nil?
end
items = new_items
Ma non sembra così idiomatico. C'è un bel modo per mappare una funzione su un elenco, rimuovendo / escludendo gli zero mentre procedi?
filter_map
, che sembra essere perfetto per questo. Salva la necessità di rielaborare l'array, ottenendolo invece come desiderato per la prima volta. Maggiori informazioni qui.