2014-09-19 14 views
5

Perché questi due equivalenti?Perché è (10..20) .last uguale a (10 ... 20) .last

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

Questo suona come un duplicato di Ruby 'Range.last' does not give the last value. Why?, ma le risposte a questa domanda semplicemente dire che è in base alla progettazione. Perché è progettato in questo modo? Qual è lo scopo di .. e ... restituendo gli stessi valori per last quando tutto il resto è diverso?

+1

OK, la risposta a questo semplicemente afferma, questo è di progettazione. Quindi la mia domanda allora e aggiornerò questo sopra, PERCHÉ è questo in base alla progettazione? Perché questo è incoerente? –

+1

Non è incoerente. ultimo restituisce l'ultimo oggetto nell'intervallo. In entrambi i casi l'inizio dell'intervallo è 10 e l'ultimo è 20. Quello che vuoi veramente è (10 ... 20) .max # => 19 .last e .last (count) sono metodi diversi e comportarsi in modo diverso –

+1

Non pensare a (1..3) come a creare una serie di numeri da 1 a 3, pensala come creando un oggetto Range a partire da 1 e terminando a 3 con un comportamento inclusivo. Quindi (1 ... 3) è lo stesso oggetto con comportamento esclusivo alla fine. Entrambi hanno lo stesso valore, solo un comportamento diverso. –

risposta

7

Risponderò alla tua domanda con una domanda: qual è l'ultimo valore di 0.0...1.0?

In generale, not every Range is enumerable. Per tali intervalli con un'estremità esclusa, non esiste alcun valore significativo lastaltro rispetto al valore utilizzato per definire la fine dell'intervallo.

Si noti inoltre che è possibile enumerare inclusivi gamme dove lastnon è l'ultimo valore enumerato!

(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 

La motivazione del disegno è che "il valore utilizzato per definire la fine di un intervallo" non è identico a "l'ultimo valore enumerato da una gamma". last ti dà il primo.