Also, ich wusste schon, dass man folgendes schreiben kann, um Methoden mit beliebig vielen Argumenten zu definieren:
1 2 3 4 |
def bist_du_aber_klein(*) super essen(:vitamine) end |
Hier werden die restlichen Argumente einfach verworfen, und keiner lokalen Variable zugewiesen.
Der Stern kann auch noch in anderen Beziehungen auftauchen, zum Beispiel in Mehrfachzuweisungen oder bei Blockparametern:
1 2 |
gewinner, *nieten = die_anderen_gehen_leer_aus
array_von_arrays { |erstes, zweites, *rest| puts 'Was für ein Wetter!' } |
Interessanterweise kann man bei solchen Catch-all-Ausdrücken immer den Namen der Variable weglassen:
1 2 3 4 5 6 |
def gibs_mir *; end ja, * = nein, nein, nein obfusc do |*| end for key, * in ENV # puts(*) geht aber nicht! end |
In Ruby 1.9 geht auch:
1 2 3 4 5 6 7 |
a, *, b = *1..10 [a, b] #=> [1, 10] def letzter(*, last) last end letzter(*1..10) #=> 10 ENV.each.with_index { |(*, value), index| puts '%2d: %s' % [index, value] } |
Noch ein ganz extremes Beispiel, das nichts sinnvolles tut:
def***;%****%**;end;*a=*(a**a);b{|*|* =:*.*(:**)} |
Nützlich? Albern? Perl6? Eure Meinung!
Kommentar schreiben
Kommentare
Beim letzten Codebeispiel sieht man mal wieder, dass Obfuscating mit Coderay einfach keinen Spaß macht. Ich finde wir sollten den Highlighter wechseln, dann wirken die Codebeispiele auch wieder viel verstörender (-;
Wusste ich auch noch nicht. Diese Syntaxeigenheit finde ich aber ausnahmsweise ziemlich cool =D Erinnert mich entfernt an funktionale Sprachen, wo man ungenutzte Argumente auf Wildcardss ablädt.
@bovi: Ich habe mal auf Plaintext umgeschaltet, um den Leuten den Spaß nicht zu verderben ;)
Ruby kann schön und elegant sein wie Haskell, manchmal aber auch rätselhaft und undurchschaubar wie Perl. Eine echte Diva!
Wieder ein Hilfsmittel mehr, um schöne APIs / DSLs bauen zu können :).
Bekomme das letzte Codebeispiel leider mit keiner Rubyversion zum laufen. Fehler ist meist “private method for nil” und in irb1.8: “stack level too deep”.
Btw, wenn wir gerade bei obfusication sind, DAS ist (Perl5)-Magie: http://tr.im/saturnizing :)
JL: Das Beispiel ist nicht lauffähig, aber syntaktisch korrekt. Der Fehler im IRB klingt nach einem Bug.
Achso: Wenn du lustige Obfuscation-Art in Ruby sehen möchtest, gibt es noch http://rubyforge.org/pipermail/poignant-stiffs/2005-August/000202.html.
murphy: Der ChunkyBacon-Link ist leider tot :/