2012-07-13 12 views
7

Wenn die dreifache Punktnotation in einem Objektbereich Rubin verwenden, erhalte ich diese:Ruby 'Range.last' gibt nicht den letzten Wert. Warum?

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

Als ich die ‚letzte‘ Methode verwenden, die ich erhalte:

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

ich erwartet hätte 4

Ist das ein Fehler? Oder verstehe ich etwas über das Konzept eines Range-Objekts nicht?

+1

Hier ist, was Sie nicht über Range-Objekte verstehen: Sehen Sie die Bereich 'Math :: E ... Math :: PI'. Was sollte 'last' sein? Bereiche sind buchstäblich nur ein Anfang, ein Ende und ob das Ende ausgeschlossen ist oder nicht. Die Tatsache, dass ganzzahlige Bereiche aufgezählt werden können, ist eine Besonderheit. Bereiche haben viele andere Anwendungen. – Max

+0

Bereich hat die 'end' Methode dafür, ich drückte. Ich vermisse jedoch die Startmethode. – Rempargo

Antwort

11

Dies ist von Entwurf. Die Ruby-2.0-Dokumentation ist more specific:

Beachten Sie, dass ohne Argumente last das Objekt zurück, das das Ende des Bereichs, selbst wenn exclude_end?true ist definiert.

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

Wie Stefan hat Ihr beobachtete Verhalten erwartet wird und dokumentiert beantwortet.

Wenn Sie das letzte Element erhalten möchten, die durch den Bereich aufgezählt werden würde, ohne den gesamten Bereich aufzuzählen hat, könnten Sie Enumerable#reverse_each

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

'reverse_each.first' * does * zähle den ganzen Bereich auf – Stefan

+1

Oder vielleicht' (0 ... 5) .max' –

+0

@Stefan Du hast völlig Recht. Ich weiß nicht, was ich dachte - wie könnte Enumerable spezielle Kenntnisse über die umgekehrte Aufzählung der Klasse haben, in die es eingemischt ist. – dbenhur

Verwandte Themen