arr = ["a", "b", "c", "d", "e"]
def for_and_aft(arr, idx)
index_range = 0..arr.size-1
[arr.values_at(*[idx-2, idx-1].grep(index_range)),
arr.values_at(*[idx+1].grep(index_range))]
end
for_and_aft(arr,0)
#=> [[], ["b"]]
for_and_aft(arr,1)
#=> [["a"], ["c"]]
for_and_aft(arr,2)
#=> [["a", "b"], ["d"]]
for_and_aft(arr,3)
#=> [["b", "c"], ["e"]]
for_and_aft(arr,4)
#=> [["c", "d"], []]
См. Массив # values_at и Enumerable # grep .
Рассмотрим idx = 1
. Выполняются следующие расчеты.
index_range = 0..arr.size-1
#=> 0..4
a = [idx-2, idx-1]
#=> [-1, 0]
b = a.grep(index_range)
#=> [0]
c = arr.values_at(*b)
#=> ["a"]
d = [idx+1]
#=> [2]
e = d.grep(index_range)
#=> [2]
f = arr.values_at(*e)
#=> ["c"]
[c,f]
#=> [["a"], ["c"]]
В вычислениях b
, grep
использует Range # === для оценки
(0..4) === -1
#=> false
(0..4) === 0
#=> true
и, следовательно, возвращает [0]
.