ruby-mine

exploring the mine

Rubinrote Strings - Teil 3: Heredocs

von murphy am 19.04.2006 (10 Uhr)

Zeit für den Myntax-Mittwoch! Und zwar geht es um

Heredocs - oder - Code in der 2. Dimension

So sieht ein Heredoc aus:


mein_komischer_string_mit_komischen_zeichen = <<ende
  Mit "komischen Zeichen" meine ich '
  S\\\\o/w(a`s.
ENDE

Man benutzt Heredocs, um mehrzeilige Strings oder Strings mit sehr vielen Sonderzeichen oder beliebigem Text zu erzeugen. Im letzten Kapitel ging es ja um Fancy Strings, die einen beliebiges Zeichen als Begrenzer erlauben. Heredocs erlauben nun beliebige Strings als Begrenzer von Strings.

Jetzt noch ein praktischeres Beispiel:


def make_stylesheet css, in_tag = false
  sheet = css.stylesheet
  sheet = <<-CSS if in_tag
<style type="text/css">
#{sheet}
</style>
  CSS
  sheet
end

Nett, oder? Ich glaube, genau für sowas sind Heredocs gedacht. Kommen wir zur

Syntax (Oberfläche)

Das letzte Beispiel macht deutlich, dass Heredocs ein ganz besonderes syntaktisches Element sind: Obwohl sie ein einzelnes Token darstellen, sind sie aufgeteilt in Kopf (<<-CSS) und Rumpf (Inhalt). Zwischen Kopf und Rumpf kann Code stehen, aber beide Teile sind offenbar magisch miteinander verknüpft. Dazu später mehr.

Heredocs sehen so aus:

Heredocs ohne Anführungszeichen werden interpretiert. Die Benutzung von <<"Doppelten Anführungszeichen" ist also nur nötig, wenn man Sonderzeichen im Namen benutzen will oder explizit sein möchte. Ansonsten sollte man immer die einfachen Quotes verwenden, wenn man keine Interpretation braucht. Zur Sicherheit.

Syntax (deep)

Wenn ich ehrlich bin (Ruby-Minenarbeiter sind immer ehrlich!), habe ich mich vor diesem Artikel gefürchtet. Heredocs (von englisch Here Document - "Hier Dokument") sind wirklich kompliziert, wenn man sie vom Standpunkt des Interpreters betrachtet. Wie funktioniert das eigentlich, dass man nach dem Namen noch Code schreiben darf?

Ich übersetze hier mal aus der Dokumentation zum Rdoc-Lexer, also die Klasse, die sich darum kümmert, Ruby-Code in einzelne Token zu zerlegen:

Hier muss auch Here-Document-Umleitung erlaubt sein. Dieses kleine Juwel kommt ins Spiel, wenn der Lexer auf ein Here Document stößt. An diesem Punkt muss der Eingabestrom im Prinzip in zwei Teile zerlegt werden: Einen, um den Rumpf des Here-Documents zu lesen, und einen anderen, um den Rest der Eingabezeile zu scannen, in der das Here-Document beginnt. Zum Beispiel könnte man so etwas haben:
do_something(<<-A, <<-B)
  stuff
  for
A
  stuff
  for
B
Wenn der Lexer auf das <<A stößt, liest er die Zeile bis zum Ende und behält sie im Speicher. Dann liest er den Rumpf des Here-Documents. Wenn er fertig ist, liest er den Rest der Originalzeile, überspringt dann aber den bereits gelesenen Rumpf.

Tief durchatmen. Kopf nach rechts drehen, um 90°. Heredocs sind vertikale Strings! Sie gehen in die Tiefe, während der eigentliche Code linear weiterläuft. Es ist wirklich am einfachsten, sich Heredocs als Strings in der 2. Dimension vorzustellen.

Missverstanden

Zum Abschluss noch eine Kuriosität. Sehr viele Leute scheinen Metaklassen-Blöcke so einzuleiten:

class <<self

Dieses Ruby-Idiom ist ja bekannt. Aber wieso zur Hölle so eine hässliche Zeichensetzung, die doch nur den Editor durcheinanderbringt? Das ist kein Heredoc. Bitte so:

class << self

Weiterlesen


Kommentar schreiben

Name (notwendig)

Mail (wird nicht veröffentlicht)

Webseite


Kommentare

  1. Ruby-Mine &raquo; Blog Archive &raquo; [2050°C] Der Anfang schrieb am 20.04.2006 (02 Uhr)

    [...] Murphy hat Euch in den letzten Wochen, einen tiefen Einblick in die syntaktischen Finessen von Ruby geliefert. Ihr habt normale Strings und Fancy Strings kennengelernt. Es stellte sich heraus, dass Here Docs ebenfalls nur Strings, mit einer zusätzlichen Dimension, sind. Die funktionale Programmierung mit proc Objekten macht Euch das Leben um einiges leichter. Und ein exception handling mit rescue ist nun zu einem selbstverständlichen Codefragment geworden, welches jeden unsicheren Code schmückt. Parallel hierzu möchten wir euch nun auf einer neuen Ebene einen Einblick in unseren Rubin verschaffen. Hierzu fahren wir die Schmelzanlage auf knapp 2050°C hoch und schauen uns an, was sich im inneren des Edelsteins befindet. [...]

  2. Ruby-Mine &raquo; Blog Archive &raquo; Reguläre Ausdrücke - Teil 1: Gruppen, Quantoren und K schrieb am 05.06.2006 (23 Uhr)

    [...] Woran liegt das? Ganz einfach! Ich habe fälschlicherweise den gierig gefrässigen Quantor * benutzt. Der sorgt dafür, dass nach dem ersten <b> erst mal der ganze Rest versucht wird. Da streikt natürlich die Mustermaschine, denn die verlangt ja noch nach einem abschliessenden </b>. Also rückt der gefrässige Teil Zeichen für Zeichen wieder heraus (das vorhin vorgeführte Problem tritt hier nicht auf), bis ein </b> freigegeben wird - es ist allerdings das letzte! Da dies Ergebnis nicht meinen Erwartungen entspricht, nun ein zweiter Versuch. Bei diesem möchte ich nebenbei noch auf murphys Beitrag Rubinrote Strings - Teil 3 Heredocs verweisen. [...]