ruby-mine

exploring the mine

def ohne Ende

von murphy am 09.09.2008 (22 Uhr)

Zucker für Syntax-Spielkinder, diesmal:

Ruby-Mine präsentiert lustige Kommas am Ende von Methodendefinitionen.

Nein, keine Litschi, sondern ein weiteres interessantes Detail der Ruby-Syntax.

Log: removed very funny comma ;-)

Die Geschichte stammt von einem Tippfehler von zickzackv in einem Projekt für die Arbeit. Er schrieb:

  def file_replace filename, file,
    files = document.files
    ...

Der Code machte das, was er sollte. Das liegt daran, dass die Zeile nach dem def von Ruby als optionales Argument verstanden wird. Als hätte man geschrieben:

  def file_replace filename, file, files = document.files

Fiel uns dank der automatisch versendeten Commit-Meldungen mit Diffs auf. Funktioniert ohne Klammern, und vor allem: ohne Warnung. Eine klare Fehlerquelle, und Futter für Codegolfer und andere Freaks ;)

Könnte das nützlich sein?

Nicht wirklich. Ich dachte, man könnte es vielleicht nutzen, um die Parameter zu dokumentieren:

def divide \
  a,   # dividend
  b    # divisor
  a / b
end

Aber natürlich kapiert Rdoc das nicht, es kommt nur bis zum Komma (immerhin). Sieht außerdem hässlich aus. K&R-Stil.

Ich habe jetzt erstmal eine Mail an ruby-core geschickt mit dem Vorschlag, eine passende Warnung in Ruby einzubauen.

Abwehrmaßnahmen

Wie verhindert man solche Tippfehler, solange es keine Ruby-Warnung gibt? Man kann natürlich seinen Code checken lassen:

for file_name in Dir['**/*.rb']
  data = File.read file_name
  puts file_name if data[/^\s*def\b[^(\n]*,\s*$/]
end

aber das ist langsam und doof. Man kann auch immer Klammern benutzen, dann hätte man das Problem im Anfangsbeispiel sofort bemerkt, denn Ruby erlaubt keine Klammern am Ende von Signaturen (syntax error, unexpected ')').

Für Leute, die lieber ohne Klammern programmieren (wie ich (meistens jedenfalls (es sei denn ich muss))) bleibt nur: Aufpassen.


Kommentar schreiben

Name (notwendig)

Mail (wird nicht veröffentlicht)

Webseite


Kommentare

  1. zickzackv schrieb am 10.09.2008 (00 Uhr)

    Very very funny comma ;-)