Mam wartość, map
która albo zmienia wartość, albo ustawia ją na zero. Następnie chcę usunąć z listy wpisy zerowe. Lista nie musi być przechowywana.
Oto, co obecnie mam:
# 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]
Wiem, że mógłbym po prostu wykonać pętlę i warunkowo zebrać w innej tablicy takiej jak ta:
new_items = []
items.each do |x|
x = transform(x)
new_items.append(x) unless x.nil?
end
items = new_items
Ale to nie wydaje się takie idiomatyczne. Czy istnieje dobry sposób na mapowanie funkcji na liście, usuwając / wykluczając nils w miarę przemieszczania się?
filter_map
, co wydaje się idealne do tego. Oszczędza potrzebę ponownego przetwarzania tablicy, zamiast tego wykonując ją zgodnie z oczekiwaniami za pierwszym razem. Więcej informacji tutaj.