2012-07-13 8 views
7

Cuando se utiliza la notación de puntos triples en un objeto de rubí Rango, me sale esto:Ruby 'Range.last' no da el último valor. ¿Por qué?

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

Cuando utilizo el método de 'última' me sale:

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

lo que habría esperado 4

¿Esto es un error? ¿O hay algo que no entiendo sobre el concepto de un objeto Range?

+1

Aquí es lo que usted no está entiende sobre objetos Rango: considerar la rango 'Matemáticas :: E ... Matemáticas :: PI'. ¿Qué debería 'durar' ser? Los rangos son literalmente solo un comienzo, un final y si el final está excluido o no. El hecho de que los rangos enteros puedan enumerarse es una característica especial. Los rangos tienen muchos otros usos. – Max

+0

El rango tiene el método 'end' para eso, presioné. Me falta el método 'start' sin embargo. – Rempargo

Respuesta

11

Esto es por diseño. La documentación de Ruby 2,0 es more specific:

Nota que sin argumentos last devolverá el objeto que define el final de la gama incluso si exclude_end? es true.

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

Como Stefan ha respondido a lo esperado y se documenta su comportamiento observado.

Si desea obtener el último elemento que se enumeró por el rango sin tener que enumerar toda la gama, se puede usar Enumerable#reverse_each

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

'reverse_each.first' * does * enumera todo el rango – Stefan

+1

O tal vez' (0 ... 5) .max' –

+0

@Stefan Tienes toda la razón. No sé lo que estaba pensando: ¿cómo podría Enumerable tener un conocimiento especial de la enumeración inversa de la clase en la que se mezcla? – dbenhur

Cuestiones relacionadas