ruby-mine

exploring the mine

Der Star der Ruby-Syntax

von murphy am 12.01.2010 (00 Uhr)

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

Name (notwendig)

Mail (wird nicht veröffentlicht)

Webseite


Kommentare

  1. bovi schrieb am 12.01.2010 (07 Uhr)

    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 (-;

  2. Kai schrieb am 12.01.2010 (12 Uhr)

    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.

  3. murphy schrieb am 13.01.2010 (21 Uhr)

    @bovi: Ich habe mal auf Plaintext umgeschaltet, um den Leuten den Spaß nicht zu verderben ;)

  4. toxicburst schrieb am 14.01.2010 (08 Uhr)

    Ruby kann schön und elegant sein wie Haskell, manchmal aber auch rätselhaft und undurchschaubar wie Perl. Eine echte Diva!

  5. JL schrieb am 18.01.2010 (18 Uhr)

    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 :)

  6. murphy schrieb am 20.01.2010 (05 Uhr)

    JL: Das Beispiel ist nicht lauffähig, aber syntaktisch korrekt. Der Fehler im IRB klingt nach einem Bug.

  7. murphy schrieb am 20.01.2010 (05 Uhr)

    Achso: Wenn du lustige Obfuscation-Art in Ruby sehen möchtest, gibt es noch http://rubyforge.org/pipermail/poignant-stiffs/2005-August/000202.html.

  8. JL schrieb am 23.01.2010 (13 Uhr)

    murphy: Der ChunkyBacon-Link ist leider tot :/