2012-07-13 20 views
7

Khi sử dụng các ký hiệu dấu chấm ba trong một đối tượng ruby ​​Range, tôi có được điều này:Ruby 'Range.last' không đưa ra giá trị cuối cùng. Tại sao?

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

Khi tôi sử dụng phương pháp 'cuối cùng' tôi nhận được:

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

tôi dự kiến ​​sẽ có 4

Đây có phải là lỗi không? Hoặc có điều gì đó tôi không hiểu về khái niệm của một đối tượng Range?

+1

Đây là những gì bạn không hiểu về các đối tượng Phạm vi: xem xét các phạm vi 'Toán học :: E ... Toán học :: PI'. Điều gì sẽ 'cuối cùng' được? Phạm vi theo nghĩa đen chỉ là sự bắt đầu, kết thúc và liệu kết thúc có bị loại trừ hay không. Thực tế là dãy số nguyên có thể được liệt kê trên là một tính năng đặc biệt. Phạm vi có rất nhiều công dụng khác. – Max

+0

Phạm vi có phương thức 'kết thúc' cho điều đó, tôi nhấn mạnh. Tôi đang thiếu phương thức 'start'. – Rempargo

Trả lời

11

Đây là theo thiết kế. Các tài liệu của Ruby 2.0 là more specific:

Lưu ý rằng không có đối số last sẽ trả lại đối tượng định nghĩa cuối của dãy thậm chí nếu exclude_end?true.

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

Như Stefan đã trả lời hành vi quan sát của bạn được mong đợi và ghi lại.

Nếu bạn muốn để có được những yếu tố cuối cùng mà sẽ được liệt kê bởi phạm vi mà không cần phải liệt kê toàn bộ phạm vi, bạn có thể sử dụng Enumerable#reverse_each

irb> (0...5).reverse_each.first 
=> 4 
+0

'reverse_each.first' * không * liệt kê toàn bộ phạm vi – Stefan

+1

Hoặc có thể' (0 ... 5) .max' –

+0

@Stefan Bạn hoàn toàn đúng. Không biết những gì tôi đã suy nghĩ - làm thế nào có thể Enumerable có kiến ​​thức đặc biệt của đếm ngược của lớp nó trộn lẫn vào. – dbenhur

Các vấn đề liên quan