Syntax-Sonntag, verspätet. Ich hatte bis eben noch Urlaub. Heute geht es, wie versprochen, um
Ja, von sowas träumen Java- und Pascal-Programmierer nachts: Nützliche kleine syntaktische Zuckerwürfel, die einem Ruby-Programmierer das Leben erleichtern. Außerdem würde Obfuscation ohne Fancy Strings nur halbsoviel Spaß machen.
Kostproben:
%q(Es gibt 4 verschiedene Anführungszeichen: "'`´.) %r{ [A-Z] \\w{5} \\b }x plugin_paths += %W( #{VENDOR}/html_plugins ) unless XHTML %Q'Instanzvariablen können #@eingebaut werden,\\ #@@klassen_variablen\\n und #$globale auch.' %r\\VERY STRANGE!\\x %%%%%%%.empty?
Grundsätzlich sieht ein Fancy String so aus:
Dieser wohl bekannteste Typ erzeugt String-Arrays. Die Zeichenkette wird an jedem Leerzeichen getrennt; maskierte Leerzeichen werden ignoriert. Das Beispiel erzeugt ["John", "James", "Sean Paul"].
Besonders gerne benutze ich diese String mehrzeilig, als Ersatz für Datenfelder:
PREDEFINED_CONSTANTS = %w[ nil true false self DATA ARGV ARGF __FILE__ __LINE__ ]
Oder, in Rails:
inflect.uncountable %w( elvis\\ presley chaos penner )
Man erkennt, warum matz diesen Buchstaben gewählt hat: %w erzeugt Wortlisten.
| Typ | erzeugt | interpr. | Besonderheiten |
| String | ja | keine alphanumerischen Zeichen als Begrenzer erlaubt | |
| Q | String | ja | |
| q | String | nein | |
| w | String-Array | nein | Leerzeichen müssen maskiert werden |
| W | String-Array | ja | dito |
| s | Symbol | ja | |
| x | Ergebnis des Systemaufrufs als String | ja | |
| r | Regexp | ja | Modifier können angehängt werden |
Relativ einfach ist zu erkennen, wie Ruby mit Klammern umgeht:
%r[irgendwie logisch] %q(Klammern (sowas hier: ()) kann man schachteln.) %s>Achtung! Hier wartet Ruby nicht auf < sondern auf >
Verwirrender ist allerdings, dass Zeilenwechsel als Begrenzer dienen dürfen:
p %q test #-> "test"
Und ganz komisch wird es, wenn man Zeichen verwendet, die Ruby normalerweise interpretiert. Hier gibt Ruby dem Begrenzer immer den Vorrang.
%Q#Jetzt kann ich keinen \\#{Inline-Code} mehr benutzen!# %\\Sieht aus wie eine Regexp im Spiegel.\\
Als Beispiel für Code, den keiner lesen kann, benutze ich das folgende Ornament:
%%%%%%%
Hierbei handelt es sich um zwei Fancy Strings, die mit dem Operator % verknüpft werden; beide Fancy Strings sind simple Q-Strings, die als Begrenzer verwirrenderweise das Prozentzeichen verwenden. Also: %%% == "", so einfach. Und "" % "" ergibt wieder einen leeren String.
(0..255).map do |c| type = c.chr #next unless type[/[a-z]/i] type if `ruby -ce 'p %#{type}(ls)'`['Syntax OK'] end.display
Liefert bei mir exakt den String " ')=QWqrswx". Die Erklärung der 4 ersten Zeichen bleibt dem Leser als Übungsaufgabe überlassen.
Viel Spaß mit Ruby!
Kommentar schreiben
Kommentare
Da hat der Murphy doch glatt einen Fehler eingebaut: »Dann folgt ein beliebiger Begrenzer: Alles, was kein Whitespace ist, ist erlaubt [...]« irb> % abc => "abc" Nützlich war zu erfahren, daß %Q als % abgekürzt werden kann. Malte
Danke für deine Aufmerksamkeit, Malte! Ich habe es korrigiert. Ich hatte gerade nachgeschaut, ob ich das CodeRay noch beibringen kann, aber dann färbt er mir praktisch jeden %-Methoden-Aufruf als String.
Hi murphy! Leider funktionieren alphabetische Zeichen auch nicht wenn sie nach einem expliziten Format eingegeben werden (Stand OneClickInstaller 1.8.2) Beispielsweise liefert (in fxri getestet): irb(main):001:0> %Qabba SyntaxError: compile error (irb):1: unknown type of %string %Qabba ^ from (irb):1 from :0 Aber - ein schöner Beitrag! Motiviert mich direkt meine Sachen noch lesbarer zu machen...
Du hast recht, WoNáDo! Interessant. Jetzt greift das Argument nicht mehr ganz, dass man zukünftige Fancy-Typen reservieren wollte. Oder sind am Ende mehrbuchstabige Fancys geplant? %yaml(test) vielleicht, wie why the lucky stiff schon vorschlug? Wir sind gespannt...
%%%%%%%.empty? ist übrigends Blödsinn: Das wird als "" % false geparst und erzeugt einen Leerstring anstatt true.
[...] 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. [...]
[...] 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. [...]
[...] Wie wäre es denn mit Fancy Strings? [...]