2012-07-13 8 views
7

Podczas korzystania z potrójną dot notacji w obiekcie Ruby Range uzyskać to:Ruby "Range.last" nie podaje ostatniej wartości. Czemu?

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

Kiedy używać „ostatni” sposób uzyskać:

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

Liczyłam 4

Czy to jest błąd? Czy jest coś, o czym nie rozumiem pojęcia obiektu Range?

+1

Oto co jesteś nie zrozumieć o obiektach zakres: rozważyć zakres 'Math :: E ... Math :: PI'. Co powinno "trwać"? Przedziały to dosłownie tylko początek, koniec i to, czy koniec jest wykluczony. Fakt, że można zaklasyfikować zakresy całkowite, jest specjalną cechą. Zakresy mają wiele innych zastosowań. – Max

+0

Range ma metodę "end" do tego, ja presumed. Brakuję jednak metody 'start'. – Rempargo

Odpowiedz

11

Jest to zgodne z projektem. Dokumentacja Ruby 2.0 jest more specific:

Należy pamiętać, że bez argumentów last zwróci obiekt, który określa górną granicę zakresu nawet jeśli exclude_end? jest true.

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

Stefan odpowiedział oczekuje Twój obserwowane zachowanie i udokumentowane.

Jeśli chcesz uzyskać ostatni element, który będzie wyliczana przez zakres bez konieczności wymienić cały zakres, można użyć Enumerable#reverse_each

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

'reverse_each.first' * does * wylicza cały zakres – Stefan

+1

A może' (0 ... 5) .max' –

+0

@Stefan Masz całkowitą rację. Nie wiem, o czym myślałem - w jaki sposób Enumerable może mieć specjalną wiedzę o odwrotnym wyliczaniu klasy, w której się miesza. – dbenhur

Powiązane problemy