ruby-mine

exploring the mine

dont do ... end

von murphy am 09.07.2006 (19 Uhr)

Syntax-Sonntag! Heute:

Blöcke Auskommentieren mit Ruby

Der einfache Kommentar in Ruby ist bekannt:

# Ich gehe bis zum Zeilenende.

Eigentor.create :author => 'Petit'  # ^_^

# Gibt eine zufällige natürliche Zahl zurück.
def random_number
  23
end
Ruby hat eine zweite, weniger bekannte Kommentar-Variante:

=begin
= Mehrzeilige Kommentare
* waren wohl ursprünglich für die Dokumentation vorgesehen
* haben sich aber nicht durchgesetzt
* man benutzt stattdessen RDoc-Kommentarblöcke mit vielen #.
=end

Ziemlich unhandlich, wenn man einfach etwas auskommentieren möchte. Zudem kann man diese mehrzeiligen Kommentare nicht schachteln.

Häufig möchte man einen Ruby-Block ausklammern – ein if, ein def, eine Klasse. Wie macht man das am einfachsten?

Naive Ansätze

=begin...=end halte ich für ungeeignet, schon weil man die Kommentarbegrenzer nicht einrücken darf:

class Foo
=begin
  def bar
    @baz.quux
=end
end
TextMate-Benutzer markieren einfach den linken Rand der Methode und drücken #. Aber man möchte nicht immer auf die Maus wechseln.

class Foo
  #def bar
  #  @baz.quux
  #end
end
Wie wäre es denn mit Fancy Strings?

class Foo
  %q(def bar
    @baz.quux
  end)
end

Funktioniert, sieht aber doof aus und verwirrt manche Editoren.

if false

Es wäre schön, wenn wir nur an einer Stelle im Code etwas editieren müssten. Nun, Ruby-Blöcke sind ausführbarer Code, auch def. Benutzen wir also einfach den if-Modifier:

class Foo
  def bar
    @baz.quux
  end if false
end
Die Methode bar wird somit nie erzeugt, weil Ruby den Block vor if false nicht beachtet (die Syntax wird aber trotzdem überprüft!) Es gibt noch Varianten:

class Foo
  def bar
    @baz.quux
  end unless true

  module KurpW
    Version = 08.15
  end if()
end

() ist eine andere Schreibweise für nil; if() macht genau dasselbe wie if false.

Nun, dann können wir auch ausnutzen, dass Ruby für alle Blöcke dasselbe Schlusszeichen verwendet:

class Foo
  if()
  #module KurpW
    Version = 08.16
  end
end

Voilà! Zu An- und Ausschalten einfach die Raute umsetzen.

dont do

“if()” ist nicht sehr verständlich, sondern eher ein weiteres komisches Metallteil im Werkzeugkasten der Obfuscatoren.

Ruby-Programmierer möchten schreiben:

class Foo
  #module KurpW
  dont do
    Version = 08.17
  end
end
Kein Problem:

module Kernel
  # Ignores its optional block.
  def dont
  end
end

Editor-freundlich, lesbar, schachtelbar. Ruby erweitert um exzellente Block-Auskommentierung via Vierzeiler.

Wusstet ihr übrigends, dass die Verwendung der Raute (#) als Kommentarzeichen bereits aus ALGOL 68 stammt?


Kommentar schreiben

Name (notwendig)

Mail (wird nicht veröffentlicht)

Webseite


Kommentare

  1. WoNáDo schrieb am 10.07.2006 (02 Uhr)

    Sehr schön! Ich finde bei "dont do" auch sehr schön dass die Syntax gecheckt wird. Es ist manchmal sehr ärgerlich wenn man Code ausklammert, dabei irgendwas im Code versehentlich verändert, es nicht merkt und sich später nur noch wundert. PS: Schön mal wieder an Algol68 erinnert zu werden. Da konnte man sich ja auch fast alles so zurecht definieren wie man wollte.