Da Fragen aufgetaucht sind, beleuchten wir das neue Feature von Ruby 1.9 mal genauer. Nehmen wir uns eine Funktion, die alle möglichen Arten von Argumenten hat:
def foo(a, b = :default1, c = :default2, *d, e, &f) [a, b, c, d, e, f] end
rake19 – das ist der Befehl, der in meinem Edge-Rails-Verzeichnis die Tests für Ruby 1.9.0 laufen lässt.
So sieht die Ausgabe der Tests gegen Revision 8514 + ein paar Patches von mir zur Zeit unter Mac OS X 10.5 aus:
unexpected aliasing, den bekomme ich auch mit Ruby 1.8.Also: Wenn ko1 den blöden module_eval-bug noch fixt, kann es eigentlich losgehen ;)
Neugierige können sich den Patch herunterladen und selber testen. Oder einfach noch ein wenig warten.
Update 2008-01-07: Nichts neues :(.
Matz ist vorbeigekommen und er hat uns etwas mitgebracht! Einen funkelnden Rubin mit der Aufschrift 1.9.0
Nun höre ich schon die ersten Leute grummeln:
Schon wieder ein neues Release? Es gab doch gerade mal vor knapp 7 Monaten die 1.8.6, sollte diese Version nicht überings 1.9.1 heißen und 0.0.4 Versionspunkte sind ja auch nicht gerade viel. ALLES DOOF!!".Diese Leute irren sich! Die 0.0.4 Versionspunkte haben es in sich.
Nur damit wir hier nicht die Letzten mit der Ankündigung sind. Ruby 1.9.0 wurde soeben veröffentlicht. Es folgt noch eine genauere Beschreibung.
Ein Blick in ruby-core, ein zweiter Blick in den trunk und ich kann meinen Augen immer noch nicht trauen. rake ist integraler Bestandteil von Ruby? 3 Tage vor dem ersten ‘stabilen’ Release des 1.9er Branches? Gegen rake selber habe ich absolut nichts. Auch nicht gegen den festen Einbau in Ruby (ganz im Gegenteil). Aber wieso wird eine solche gravierende Änderung jetzt noch durchgeführt? In solchen Situationen halte ich die Ruby Kernentwickler doch für sehr unprofessionell )-:
Jawohl :)
class Feeling def ~ p :drunk end def ! p :alert end def -@ p :bad end def +@ p :good end end feeling = Feeling.new -feeling # => :bad +feeling # => :good !feeling # => :alert ~feeling # => :drunk # >> :bad # >> :good # >> :alert # >> :drunk
Der Fachmann/Die Fachmassaigiraffe sieht hier mehrere Dinge:
p gibt seine Argumente nicht nur aus, sondern auch zurück (statt nil.)matz sagt:
For good news, I have no big change left.
Das folgende habe ich gerade im Ruby Trunk entdeckt:
Es gibt ein paar Änderungen zum in Ruby 1.9 aus neuen Snapshots auf Windows erstellen beschriebenen Vorgehen.
Viel Spass beim Experimentieren und Testen.
Nicht dass ich Ruby jemals mit einem hässlichen Entlein vergleichen würde oder so, aber eine Klasse war nicht so gelungen, weil sie eigentlich etwas anderes war: String
Seit geraumer Zeit geistert Unicode durch die Datenwelt, neben anderen Multibyte-Encodings, die ja für die Asiatischen Zeichensätze eh unumgänglich sind.
Vor längerer Zeit stellte ich ganz am Anfang meiner Ruby-Experimente in einem (nicht mehr existierenden) englischsprachigen Ruby-Forum die Frage nach den Unicode-Möglichkeiten mit Ruby. Ich erhielt die Antwort, dass Ruby "encoding agnostic" sei.
Schnell stellte ich dann fest, dass die Klasse String eigentlich ihren Namen nicht verdient, sondern eher Bytes hätte heissen müssen. Dies legte beispielsweise 'a'[0] auch nahe, weil man nicht etwa 'a' als Antwort erhielt, sondern 97. Alle anderen Methoden der Klasse verhielten sich entsprechend.
Lange Zeit geisterten dann diverse Initiativen oder Ideen für eine bessere Unicode-Unterstützung durch die Klasse String im Internet-Universum herum - nur - es passierte nicht wirklich was und ich war bestimmt nicht der einzige der langsam skeptisch wurde.
Dann las ich beinah ungläubig eine eigenclass-RSS-Mitteilung und den Artikel über die Änderungen der Klasse String.
Erste Tests mit einer aktuellen Version zeigen zwar, dass noch nicht alles vollständig ist (auch murphy machte schon diese Erfahrung), aber Strings für Ruby 1.9.1 sind auf dem besten Weg!
Da muss ich mich wohl beim Rails-Core-Team entschuldigen: Sie arbeiten tatsächlich an Ruby-1.9-Kompatibilität, siehe Changeset 7474.
Also irgendwas tut sich da. Jeremy Kemper schreibt seit gestern fleißig neue Changesets. Rails läuft zwar immer noch nicht unter Ruby 1.9, aber das Team ist aufgewacht!
Danke, Jeremy!
Wie üblich auf rubychan.de. Jetzt mit Quellcode am Ende!
92 Tage noch bis zum erwarteten Release von Ruby 1.9.1. Und Rails ist kein bisschen kompatibler geworden. Schade.
Die neuesten Benchmarks (MacBook) zeigen, dass Ruby 1.9 (die nächste Version) zunehmend schneller wird. Lag die durchschnittliche Beschleunigung gegenüber Ruby 1.8 im April noch bei 3,171x (+217%), so sind es inzwischen 3,39x (+290%). Vergleicht man diese Werte mit einem Zauber in World of Warcraft, so entspricht das etwa 5,2 Levelups. Einer der Talentpunkte wurde klugerweise für JSON ausgegeben; die anderen werden offenbar für Level 2.0 aufgehoben.
Zur Zeit befindet sich die Ruby-Core-Gilde in einer neuen Dungeon-Instanz im Königreich Stable: In der 1.8.6-Höhle laufen ganz eklige Käfer herum (Level 40 und höher!) Der befreundeten Gilde der Ruby-Minenarbeiter, die dieses Blog betreiben, teilte man mit, dass man bis zum 9. Juni (also diesen Samstag) wieder ans Tageslicht kommen will. Alle willigen Rubyisten werden gebeten, bei der Käferjagd mitzuhelfen. Vor einer Weile wurden sogar 2000g Belohnung für die Beseitigung eines Elitekäfers ausgesetzt.
JSON ist eine Alternative zu YAML, findet zunehmend Verbreitung und wird unter anderem von Rails benutzt, um Daten über die AJAX-Schnittstelle zu senden. Das Ruby-Core-Team hat sich jetzt entschieden, Ruby serienmäßig damit auszurüsten:
Mon Jun 4 21:15:45 2007 NARUSE, Yui <naruse@ruby-lang.org>
* lib/json.rb, lib/json, ext/json, test/json:
import JSON library.
require 'json' # To create a JSON text from a ruby data structure, you # can call JSON.generate (or JSON.unparse) like that: json = JSON.generate [1, 2, {"a"=>3.141}, false, true, nil, 4..10] # => [1,2,{"a":3.141},false,true,null,"4..10"] # It's also possible to call the #to_json method directly. json = [1, 2, {"a"=>3.141}, false, true, nil, 4..10].to_json # => [1,2,{"a":3.141},false,true,null,"4..10"]
$ irb19 -rjson irb(main):001:0> jj Array('1.8'..'2.4') [ "1.8", "1.9", "2.0", "2.1", "2.2", "2.3", "2.4" ] => nil
Die Bibliothek wurde in C von Florian Frank geschrieben und gestern in den trunk importiert (das heißt, in Ruby 1.9.) Zu Weihnachten gibt es also schnellen JSON-Import und -Export in Ruby.
Seit dem 23.05.2007 befindet sich nun die Version 5.7.0 der Oniguruma Bibliothek im Ruby trunk. Dies ist gerade deshalb sehr interessant, weil der Autor dieser Regexp Bibliothek offiziell verkündet hat, dass er mit der Version 5 die Kompatibilität zu Ruby aus den Sourcen entfernen will und die Bibliothek mit allgemeingültigen Schnittstellen ausrüsten möchte. Mit diesen sollte es dann auch leichter möglich sein, die Engine in anderen Programmen zu verwenden (TextMate tut dies bereits).
Hauptsächlich wurde in der 5er Version tatsächlich der Sourcecode überarbeitet und die API gesäubert. Aber es wurden auch eine Menge Fehler beseitigt und mehrere Verbesserungen an der Bibliothek in Sachen Performance durchgeführt. Ich hoffe WoNáDo gibt uns noch einen Überblick was sich rein funktionell so geändert hat.
Kurz und schmerzlos, nicht sonderlich mühsam formatiert, sondern praktisch einfach vom Forum kopiert. murphy meinte, dass das ein Blog-Beitrag werden sollte - vielleicht hat er ja recht und es funktioniert sogar noch längere Zeit so. Angefangen hat es damit, dass ich aktuelle Ruby 1.9-Snapshots nicht mehr compilieren etc. konnte. Ungefähr seit Beginn 2007 wird dafür offensichtlich Ruby selber eingesetzt. Dann erhielt ich umfangreiche Tipps von reima, die aber bei mir nicht funktionieren wollten. Das alles kann man hier nachlesen, falls Bedarf existiert.
Nach längerem Versuchen habe ich es dann hinbekommen Ruby 1.9 aus dem Snapshot vom 03. Mai 2007 zu erstellen. Ob das nun mit anderen auch klappt weiss ich nicht. Ich weiss nicht einmal, ob all die Fehler, die zwischendurch mal auftraten, durch meinen Rechner (altes Notebook mit 128MB), mein System (Windows2000), die MinGW/MSYS-Versionen oder die jeweiligen Ruby 1.9-Snapshots verursacht wurden.
Fest steht nur, dass die im Folgenden beschriebene Vorgehensweise für den oben angegebenen Snapshot funktionierte. Wegen des Laufwerkes F: bleibt zu bemerken, dass mein Windows2000-System für Tests darauf installiert ist.
Folgendes habe ich gemacht (die entsprechende Software muss natürlich vorher geholt werden):
Danach steht Ruby19 in F:\ruby19 zur Verfügung. Jetzt muss man den Path noch um F:\ruby19\bin erweitern und die Datei .inputrc mit dem Inhalt...
"\M-[": "["
"\M-]": "]"
"\M-{": "{"
"\M-}": "}"
"\M-\\": "\\"
"\M-|": "|"
"\M-@": "@"
"\M-~": "~"
"\M-€": "€"
...am einfachsten in F:\ruby19 unterbringen. Dann verbleibt noch die Arbeit, eine neue Environment-Variable einzurichten. Sie muss INPUTRC heissen und als Wert F:\ruby19\.inputrc haben. Dann geht sogar irb19 so, wie man sich das wünscht (das EURO-Zeichen will doch nicht - vielleicht findet ja jemand anderes heraus, was da los ist).
Am Ende lief jedenfalls Ruby 1.9:
F:\Ruby19Build>ruby19 -v ruby 1.9.0 (2007-05-03 patchlevel 0) [i386-mingw32]