Ruby 'Range.last' не дает последнего значения. Зачем?

При использовании обозначения тройной точки в объекте Range Ruby, я получаю это:

(0...5).each{|n| p n}
0
1
2
3
4

Когда я использую «последний» метод, который я получаю:

(0...5).last
 => 5 

Я бы ожидал 4

Это ошибка? Или я что-то не понимаю в концепции объекта Range?

 Max14 июл. 2012 г., 01:03
Вот что вы не понимаете об объектах Range: рассмотрите диапазонMath::E...Math::PI, Что должноlast быть? Диапазоны - буквально только начало, конец, и исключен ли конец. Тот факт, что целочисленные диапазоны могут быть перечислены по специальному признаку. Диапазоны имеют много других применений.
 Paul Verschoor23 июл. 2012 г., 14:51
Диапазон имеетend Метод для этого, я нажал. Я скучаю поstart метод хотя.

Ответы на вопрос(2)

Поскольку Стефан ответил, ваше наблюдаемое поведение ожидается и задокументировано.

Если вы хотите получить последний элемент, который был бы перечислен диапазоном без необходимости перечислять весь диапазон, вы можете использоватьEnumerable#reverse_each

irb> (0...5).reverse_each.first
=> 4
 09 мая 2014 г., 17:03
Или, может быть(0...5).max
 21 мая 2014 г., 02:09
@ Stefan Вы совершенно правы. Не знаю, о чем я думал - как Enumerable может обладать специальными знаниями об обратном перечислении класса, в который он смешан.
 09 мая 2014 г., 15:46
reverse_each.first does перечислять весь ассортимент
Решение Вопроса

Это по замыслу. Документация Ruby 2.0более конкретно:

Note that with no arguments last will return the object that defines the end of the range even if exclude_end? is true.

(10..20).last      #=> 20
(10...20).last     #=> 20
(10..20).last(3)   #=> [18, 19, 20]
(10...20).last(3)  #=> [17, 18, 19]

Ваш ответ на вопрос