Programmieren, Sprachen, C++, Python, Ruby, PHP

   Home    Programmieren    Projekte    esearch    Musik    Linux    Links    About   
   Bundeswettbewerb    C++    Python    Ruby    PHP   
 
          

Ruby

1. Beschreibung

Ruby ist eine relativ moderne Scriptsprache. Sie ist relativ leicht zu erlernen, die Syntax ist unter anderem von Perl und Python abgeleitet. Die wichtigsten Merkmale sind:
Ruby ...

  • ... ist komplett objekt-orientiert, alles ist ein Objekt in Ruby. Beispiel: Die Zahl 1 ist in Ruby ein Objekt vom Typ Fixnum:
    1.type # => Fixnum
    1.succ # => 2
    1.to_f # => 1.0
    
  • ... ist eine Scriptsprache und kennt daher viele String-Funktionen, Reguläre Ausdrücke, ...
  • ... kann Blöcke an Methoden übergeben. Blöcke sind mehrere Anweisungen, die von geschweiften Klammern {...} oder do...end zusammengefasst werden. Wenn ein Block an ein Funktion übergeben wird, kann diese den Block mit mehreren Argumenten ausführen. Beispiel:
        1 def finde(array)
        2     for element in array
        3         # per yield wird der block ausgeführt.
        4         if yield element
        5             puts "Element gefunden: " + element.to_s
        6         end
        7     end
        8 end
        9 
       10 zahlen = [2, 5, 9, 12, 45] # In diesem Array wird gesucht
       11 
       12 finde(zahlen) { |zahl|
       13     return zahl / 5 == 9 # Wenn die Zahl geteilt durch 9 gleich 5 ergibt
       14 }
    
    Natürlich gibt dieses Script Element gefunden: 45 aus. Eine kleine Erklärung: An die Funktion finde(array) wird in Zeile 12 das Array aus Zahlen und der nachfolgende Block (12 - 14) übergeben. In der Funktion wird jetzt nacheinander für jedes Element des Arrays dieser Block mit dem Argument ausgeführt. Innerhalb des Blocks wird die Argumentliste |zahl| der Wert zugewiesen, jetzt kann man mit jedem Element des Arrays arbeiten. Der Block prüft nun, ob zahl / 5 gleich 9 ist, und gibt dann entweder true oder false an die Funktion finde zurück.
  • ... ist dynamisch typisiert. Das heisst, es werden keine strengen Unterscheidungen zwischen Typen wie z.B. bei C++ vorgenommen. Beispiel:
    x = 7
    x.type # => Fixnum
    x.to_f.type # => Float
    x.to_s.type # => String
    
  • ... braucht keine Variablen-Deklarationen. Variablen werden beim ersten Gebrauch erstellt. Es wird unterschieden zwischen lokalen Variablen (z.B. zahl), Instanz-Variablen (z.B. @zahl), Klassen-Variablen (@@zahl) und globalen Variablen ($zahl). Aus diesem Grund entfällt auch das self oder $this, dass man von anderen Programmiersprachen kennt.
  • ... erlaubt es zur Laufzeit Methoden zu Klassen und sogar Instanzen hinzuzufügen:
    # Da Ruby nur Float#round besitzt, ich aber
    # auf 2 Dezimalstellen runden muss füge ich
    # der Klasse Float die Methode round_to hinzu.
    
    class Float
        def round_to(i)
            f = (10 ** i).to_f
            nr = self * f
            return nr.round / f
        end
    end
    
    Math::PI.round_to(2) # 3.14
    
  • ... hat eine Ausnahmebehandlung, wie zum Beispiel Java:
    zahl = gets.to_i
    
    begin
        puts "10 / " + zahl.to_s + " = " + (100 / zahl).to_s
    rescue ZeroDivisionError
        puts "Teilen durch 0 nicht erlaubt!"
    end
    
  • ... hat einen Garbage Collector, der nicht mehr gebrauchte Variablen löscht.
  • ... kann noch vieles mehr ...

2. Beispiele

Eine kleine Sammlung von interessanten Beispielen:

2.1. Mehr zu Blöcken

Eine häufige Anwendung von Blöcken ist das iterieren über Arrays, Sequenzen, Hashes usw.

# Gibt das Quadrat von 1, 7 und 19 aus.
[1, 7, 19].each { |x| puts x ** 2 }

# Gibt die Quersummen der Zahlen 1 bis 100 aus
(1..100).each { |x|
    sum = 0
    x.to_s.scan(/./) { |c|
        sum += c.to_i
    }
    puts sum
}

# Was wir schon immer wissen wollten:
# Wieviele y's haben die folgenden Wörter?
%w{ Ruby C++ Python Perl }.each { |w| puts w.count "y" }

#AaBbCcDdEe..YyZz:
'a'.upto('z') { |c| print c.upcase, c }

2.2. Arrays und Hashes

Zu einer Scriptsprache gehören natürlich auch dynamische Arrays und Hashes:

def analyze(str)
    anzahl = {} # Ein Hash

    str.scan(/./) { |c|
        next if c !~ /[A-Za-z]/

        anzahl[c] = 0 if anzahl[c].nil?
        anzahl[c] += 1
    }
    puts "Der String enthält"

    anzahl.each { |c, anzahl|
        puts " -> " + anzahl.to_s + " " + c + ((anzahl > 1) ? "'s" : "")
    }
end

analyze "Hello World"

3. Mehr Informationen zu Ruby


© 2004 by David Peter