2012-07-13 19 views
7

當使用紅寶石Range對象三聯點符號,我得到這個:Ruby'Range.last'不提供最後一個值。爲什麼?

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

當我使用「最後」的方法獲得:

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

我本來期望4

這是一個錯誤?或者有什麼我不明白的關於Range對象的概念?

+1

這裏就是你不理解有關Range對象:考慮範圍'Math :: E ... Math :: PI'。最後一個應該是什麼?範圍實際上只是一個開始,一個結束,以及是否排除了結尾。整數範圍可以枚舉的事實是一個特殊的功能。範圍有很多其他用途。 – Max 2012-07-13 23:03:27

+0

範圍有'結束'方法,我推。我錯過了'start'方法。 – Rempargo 2012-07-23 12:51:45

回答

11

這是設計。紅寶石2.0文檔是more specific

注意,不帶參數last將返回其限定即使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

正如斯特凡已經回答了你的觀察到的行爲預期和記錄。

如果你想獲得這將由範圍枚舉,而無需枚舉的整個範圍的最後一個元素,你可以使用Enumerable#reverse_each

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

'reverse_each.first' *確實*枚舉整個範圍 – Stefan 2014-05-09 13:46:41

+1

或者也許'(0 ... 5).max' – 2014-05-09 15:03:31

+0

@Stefan你是完全正確的。不知道我在想什麼 - Enumerable怎麼可能對它混入的類的反向枚舉有特殊的瞭解。 – dbenhur 2014-05-21 00:09:20

相關問題