Слишком умный oneliner, который использует рекурсию:
def collect_between(first, last)
first == last ? [first] : [first, *collect_between(first.next, last)]
end
Итеративное решение:
def collect_between(first, last)
result = [first]
until first == last
first = first.next
result << first
end
result
end
РЕДАКТИРОВАТЬ: (Краткое) объяснение звездочки
Это называется оператором сплат. Он «разворачивает» массив:
array = [3, 2, 1]
[4, array] # => [4, [3, 2, 1]]
[4, *array] # => [4, 3, 2, 1]
some_method(array) # => some_method([3, 2, 1])
some_method(*array) # => some_method(3, 2, 1)
def other_method(*array); array; end
other_method(1, 2, 3) # => [1, 2, 3]