@example.each do |e|
#do something here
end
Here I want to do something different with the first and last element in each, how should I achieve this?
You can use each_with_index
and then use the index to identify the first and last items. For example:
@data.each_with_index do |item, index|
if index == 0
# this is the first item
elsif index == @data.size - 1
# this is the last item
else
# all other items
end
end
Alternately, if you prefer you could separate the 'middle' of the array like so:
# This is the first item
do_something(@data.first)
@data[1..-2].each do |item|
# These are the middle items
do_something_else(item)
end
# This is the last item
do_something(@data.last)
With both these methods you have to be careful about the desired behaviour when there are only one or two items in the list.
One of the nicer approaches is:
@example.tap do |head, *body, tail|
head.do_head_specific_task!
tail.do_tail_specific_task!
body.each { |segment| segment.do_body_segment_specific_task! }
end
A fairly common approach is the following (when there are certainly no duplicates in the array).
@example.each do |e|
if e == @example.first
# Things
elsif e == @example.last
# Stuff
end
end
If you suspect array may contain duplicates (or if you just prefer this method) then grab the first and last items out of the array, and handle them outside of the block. When using this method you should also extract the code that acts on each instance to a function so that you don't have to repeat it:
first = @example.shift
last = @example.pop
# @example no longer contains those two items
first.do_the_function
@example.each do |e|
e.do_the_function
end
last.do_the_function
def do_the_function(item)
act on item
end