There is method Enumerable#reject
which serves just the purpose:
(1..4).reject{|x| x == 3}.collect{|x| x + 1}
The practice of directly using an output of one method as an input of another is called method chaining and is very common in Ruby.
BTW, map
(or collect
) is used for direct mapping of input enumerable to the output one. If you need to output different number of elements, chances are that you need another method of Enumerable
.
Edit: If you are bothered by the fact that some of the elements are iterated twice, you can use less elegant solution based on inject
(or its similar method named each_with_object
):
(1..4).each_with_object([]){|x,a| a << x + 1 unless x == 3}