ruby-mine

exploring the mine

Ruby 1.9.x: neue Syntax für Stringinterpolation

von skade am 12.09.2010 (13 Uhr)

Ruby 1.9.2 ist jetzt eine Weile draussen und mit Rails 3 empfiehlt nun auch das größte Ruby-Projekt seinen Einsatz. Daher werde ich mal den Syntax-Sonntag wieder aufleben lassen und ein paar der Neuigkeiten in 1.9.2 vorstellen. Erster Kandidat: die verbesserte String#%-Methode. Die hier verwendeten Beispiele stammen aus der Doku von Sven Fuchs i18n-Bibliothek.

String#% verhielt sich in Ruby 1.8 wie das klassische sprintf: es erstellte aus einem Formatstring und einem Array einen String, der die Elemente des Arrays in der gewünschten, formatierten Form enthielt:


"%d %s" % [1, "message"] # => "1 message"

In Ruby 1.9 (oder einem entsprechend ausgerüsteten Ruby 1.8) ist nun auch ein Hash erlaubt. Dazu können Formatstrings nun auch labels enthalten:

1
2
3
"%{firstname}, %{lastname}" % {:firstname => "Masao", 
                                              :lastname => "Mutoh"} 
# => "Masao Mutoh"

Das ist schon bedeutend schöner als die klassische Variante:


"#{hash[:firstname]}, #{hash[:lastname]}"

Nebenbei hat die neue Form auch den Vorteil, dass diese Strings nicht #evaluiert, sondern durch die #%-Methode verarbeitet werden. Sie können also ohne Probleme in externen Dateien abgelegt werden. Formatiert werden können diese Argumente natürlich auch:

1
2
"%<integer>d, %<float>.1f" % { :integer => 10, :float => 43.4 } 
# => "10, 43.3"

Wer nicht auf 1.9 arbeitet, aber solche angenehmen Dinge trotzdem nutzen will, dem sei an dieser Stelle der gem "backports" empfohlen.


Kommentar schreiben

Name (notwendig)

Mail (wird nicht veröffentlicht)

Webseite


Kommentare

  1. Kai schrieb am 12.09.2010 (15 Uhr)

    Wenn wir schon bei 1.9 sind, warum nicht gleich: “%d, %.1f” % {integer: 10, float: 43.4 } =D

  2. rbjl schrieb am 12.09.2010 (16 Uhr)

    Vielen Dank für neues Wissen :)

  3. Skade schrieb am 13.09.2010 (08 Uhr)

    Kai: weil das wiederum nicht mit Ruby 1.8 mit Rails oder Backports funktioniert. :)

  4. Leonid Lezner schrieb am 13.09.2010 (10 Uhr)

    Hallo! Wo gibt es denn eine Referenz zu 1.9.2? Die Core Doku enthält die oben beschriebenen Möglichkeiten nicht. Dort steht zu dem String nur dass man ein Array benutzen kann.

  5. Skade schrieb am 13.09.2010 (12 Uhr)

    Leonid: ist mir auch schon aufgefallen, die Doku ist veraltet. Bin noch nicht dazu gekommen, einen Patch zu schreiben. Mach ich nächste Woche.

  6. bovi schrieb am 14.09.2010 (19 Uhr)

    Sehr cooles Gimick. Unglaublich das sowas schon seit fast zwei Jahren im Core ist und wenige haben es entdeckt (-;

    Ich hab gerade mal einen Patch für die Doku erstellt: http://redmine.ruby-lang.org/issues/show/3829

    Dabei ist mir auch noch ein Fehler in der Doku für sprintf aufgefallen. Dort wurde das Feature überings bereits ziemlich genau beschrieben.