Перейдем к массиву и вернем следующий и элемент перед текущим

Как я могу выбрать следующий и перед текущим элементом из массива при каждом повторении массива с каждым.

array.each do |a|
   # I want to fetch next and before current element.
end

Ответ 1

Посмотрите Enumerable#each_cons метод:

[nil, *array, nil].each_cons(3){|prev, curr, nxt|
  puts "prev: #{prev} curr: #{curr} next: #{nxt}"
}

prev:  curr: a next: b
prev: a curr: b next: c
prev: b curr: c next: 

Если вам нравится, вы можете обернуть его новым методом Array:

class Array
  def each_with_prev_next &block
    [nil, *self, nil].each_cons(3, &block)
  end
end
#=> nil

array.each_with_prev_next do |prev, curr, nxt|
  puts "prev: #{prev} curr: #{curr} next: #{nxt}"
end

Ответ 2

Вы можете использовать Enumerable#each_with_index, чтобы получить индекс каждого элемента при повторении и использовать его для получения окружающих элементов.

array.each_with_index do |a, i|
  prev_element = array[i-1] unless i == 0
  next_element = array[i+1] unless i == array.size - 1
end