У меня есть, map
который либо меняет значение, либо устанавливает его на ноль. Затем я хочу удалить ноль записей из списка. Список не нужно хранить.
Вот что у меня сейчас есть:
# 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]
Я знаю, что я мог бы просто сделать цикл и условно собрать в другом массиве, как это:
new_items = []
items.each do |x|
x = transform(x)
new_items.append(x) unless x.nil?
end
items = new_items
Но это не кажется идиоматичным. Есть ли хороший способ отобразить функцию на список, удаляя / исключая nils по мере продвижения?
filter_map
, который, кажется, идеально подходит для этого. Сохраняет необходимость повторной обработки массива, вместо этого получая его по желанию с первого раза. Больше информации здесь.