2012-07-13 10 views
7

Quando si utilizza la notazione dot tripla in un oggetto rosso rubino Range, ottengo questo:Ruby 'Range.last' non fornisce l'ultimo valore. Perché?

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

Quando uso il metodo 'ultima' ottengo:

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

mi sarei aspettato 4

Si tratta di un bug? O c'è qualcosa che non capisco riguardo al concetto di oggetto Range?

+1

Ecco cosa non si è capire su oggetti Range: prendere in considerazione la range 'Math :: E ... Math :: PI'. Che cosa dovrebbe durare? Le gamme sono letteralmente solo un inizio, una fine e se la fine è esclusa o meno. Il fatto che gli intervalli interi possano essere enumerati è una caratteristica speciale. Le gamme hanno molti altri usi. – Max

+0

Range ha il metodo 'end' per quello, ho premuto. Comunque mi manca il metodo 'start'. – Rempargo

risposta

11

Questo è di progettazione. La documentazione di Ruby 2.0 è more specific:

Si noti che senza argomenti last restituirà l'oggetto che definisce la fine del campo, anche se è 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

Come Stefan ha risposto alla tua comportamento osservato è previsto e documentato.

Se si desidera ottenere l'ultimo elemento che sarebbe enumerato dalla gamma senza dover elencare tutta la gamma, è possibile utilizzare Enumerable#reverse_each

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

'reverse_each.first' * fa * enumera l'intero intervallo – Stefan

+1

O forse' (0 ... 5) .max' –

+0

@Stefan Hai completamente ragione. Non so cosa stavo pensando - come poteva Enumerable avere una conoscenza speciale dell'enumerazione inversa della classe in cui è mescolata. – dbenhur

Problemi correlati