Warum funktioniert 6.xmap in Ruby 1.8.7, aber nicht in 1.8.6?

7

Das folgende Code-Snippet funktioniert in 1.8.7 unter Mac OS X, aber nicht in 1.8.6 unter Ubuntu. Warum? Gibt es eine Problemumgehung?

Funktioniert in 1.8.7:

%Vor%

Aber nicht in 1.8.6:

%Vor%

Warum gibt es einen Unterschied? Was ist die Problemumgehung für 1.8.6?

    
Lee 02.05.2010, 21:18
quelle

4 Antworten

16

In 1.8.7+ geben Iterator-Methoden wie times einen Enumerator zurück, wenn sie ohne Block aufgerufen werden. In 1.8.6 musst du

machen %Vor%

Oder Sie können für diesen speziellen Anwendungsfall einfach (0...6).map {...}

verwenden     
sepp2k 02.05.2010, 21:27
quelle
6

In Ruby 1.9 wurde die Bibliothek geändert, sodass Funktionen, die eine Iteration durchführten, ein Enumerator-Objekt zurückgaben, wenn sie ohne einen Block aufgerufen wurden. Eine ganze Reihe anderer Sprachmerkmale wurden ebenfalls geändert, und es war allgemein bekannt, dass die Kompatibilität zwischen Ruby 1.8.x und Ruby 1.9 im Interesse der Verbesserung der Sprache insgesamt gebrochen werden würde. Die meisten Leute fanden das nicht zu peinlich.

Das Ruby-Entwicklungsteam entschied, dass Ruby 1.8.7 eine Übergangsversion sein sollte, die einige der von Ruby 1.9 eingeführten Bibliotheksfunktionen hinzufügt. Sie haben eine Menge Kritik für die Entscheidung mitgenommen, und viele Ruby-Benutzer von Unternehmen blieben (und viele sind es noch) Rails auf Ruby 1.8.6 laufen, weil sie der Ansicht sind, dass die eingeführten Änderungen 1.8.7 einfach zu groß und zu riskant sind. Aber trotzdem bleibt 1.8.7, und das Zurückgeben von Iterationsfunktionen Enumerators ist eine der Funktionen, die eingebaut wurden.

Es ist diese Migrationsfunktion, die Sie in 1.8.7 sehen, die in 1.8.6 nicht vorhanden ist.

Die Antwort von sepp2k bietet eine gute Abhilfe. Es gibt nicht viel für mich, um diese Anzahl hinzuzufügen.

    
Ken Bloom 02.05.2010 21:46
quelle
1

Weil 1.8.6 #Zeitpunkte für den gegebenen Block liefert, während 1.8.7 ein Enumerator-Objekt zurückgibt, können Sie es beibehalten und Enumerable implementieren.

    
duncan 02.05.2010 21:34
quelle
1

Ruby 1.8.7 führt viele Änderungen ein. Wenn Sie sie in Ruby 1.8.6 verwenden wollen, einfach

%Vor%

Das ist es. Dies gibt Ihnen viele Methoden von 1.9.1 und dem kommenden 1.9.2, obwohl es möglich ist, require 'backports/1.8.7' nur für die Änderungen von 1.8.7 oder sogar nur die Backports, die Sie benötigen, z. require 'backports/1.8.7/integer/times'

    
Marc-André Lafortune 03.05.2010 13:57
quelle

Tags und Links