Это увлекательный вопрос. Ответ заключается в том, что при разрезании массива проверяются не отдельные элементы диапазона, а элементы first
и last
. В частности:
>> (2..-1).to_a
=> []
>> (2..-1).first
=> 2
>> (2..-1).last
=> -1
Таким образом, пример работает, так как он разрезает массив от элемента [2]
до элемента [-1]
.
Если вам нужен последовательный способ думать об этом, учтите, что (2..-1).to_a
выводит целые числа, найденные между 2
и -1
(которых нет ни одного), но что [2..-1]
означает из 2
index to -1
index .
(Источник: array.c
и range.c
в источнике Ruby.)
И, сложная бонусная часть: чтобы понять смысл, о котором вы думали, вы можете использовать
>> [:a, :b, :c, :d, :e].values_at *(2..-1).to_a
=> []