2014-09-19 39 views
5

爲什麼這兩個等價物?爲什麼(10..20).last與(10 ... 20)相同.last

(10..20).last  #=> 20 
(10...20).last #=> 20 

這聽起來像Ruby 'Range.last' does not give the last value. Why?重複,但答案對這個問題簡單地說,它的設計。爲什麼它是這樣設計的? .....當的值與其他值不同時,返回相同的值的目的是什麼?

+1

好的,答案就是簡單地說,這是設計。所以我的問題,然後我會更新上面這個,爲什麼這是由設計?爲什麼這不一致? – 2014-09-19 15:13:50

+1

這並不矛盾。最後返回範圍中的最後一個對象。在這兩種情況下,範圍的開始爲10,最後爲20. 你真正想要的是(10 ... 20).max#=> 19 .last和.last(count)是不同的方法和行爲有所不同。 – 2014-09-19 15:16:30

+1

不要以爲(1..3)創建一組從1到3的數字,認爲它是從1開始創建一個Range對象,並以包含行爲結束於3。然後(1 ... 3)是具有排他行爲的相同對象。兩者具有相同的最後值,只是不同的行爲。 – 2014-09-19 15:19:12

回答

7

我會用一個問題來回答你的問題:0.0...1.0的最後一個值是多少?通常,not every Range is enumerable。對於排除末端的這種範圍,確實沒有意義的last其他比用於定義範圍結束的值更有意義。

還請注意,您可以枚舉包括範圍其中last不是最後一個枚舉值!

(0..3.2).to_a.last 
# 3 
(0..3.2).last 
# 3.2 
(0..Float::INFINITY).to_a.last 
# don't wait up for this one 

該設計的動機是「用來定義一個範圍的端值」不等於「由一系列列舉的最後一個值」。 last給你前者。