Ruby 'Range.last' does not give the last v

2019-02-17 02:41发布

When using the triple dot notation in a ruby Range object, I get this:

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

When I use the 'last' method I get:

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

I would have expected 4

Is this is a bug? Or is there something I don't understand about the the concept of a Range object?

标签: ruby range
2条回答
仙女界的扛把子
2楼-- · 2019-02-17 03:03

As Stefan has answered your observed behavior is expected and documented.

If you want to obtain the last element which would be enumerated by the range without having to enumerate the whole range, you could use Enumerable#reverse_each

irb> (0...5).reverse_each.first
=> 4
查看更多
孤傲高冷的网名
3楼-- · 2019-02-17 03:10

This is by design. The Ruby 2.0 documentation is more specific:

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]
查看更多
登录 后发表回答