Checkliste für neue Methoden

Hier zwei grandiose Checkliste, übersetzt von Learn Ruby the Hard Way:

Methoden schreiben:

1. Beginnt die mit Methode mit einleitendem def?
2. Hat der Methodenname nur Buchstaben und Unterstriche?
3. Klammer auf, direkt nach dem Name der Funktion?
4. Stehen Parameter direkt nach der öffnenden Klammer, mit Kommas getrennt?
5. Ist jeder Parameter  einzigartig und wiederholt sich nicht?
6. Klammer zu nach den Parametern ?
7. Wurden die folgenden Zeilen der Funktion mit Tab eingerückt (Zwei Leerzeichen)?
8. Wurde die Funktion mit einem schließenden end als Gegenpart zu def abgeschlossen?

Beispiele:

Ohne Parameter:

Mit Parametern:

Beim ausführen der Funktion kann diese Checkliste helfen:

1. Wurde die Funktion mit Ihrem Namen aufgerufen?
2. Wurde die öffnende Klammer hinter den Namen gesetzt?
3. Wurden die gewünschten Werte, mit Komma getrennt, nach der öffnenden Klammer aufgeführt?
4. Wurde danach die schließende Klammer verwendet?
5. Funktionen ohne Parameter brauchen zwar die Klammern () nicht zwingend, aber wäre es nicht vorteilhaft sie dennoch zu verwenden?

Beispiele:

Ohne Parameter

Mit Parametern:

Diese Zeilen reichen zur Ausführung der Funktionen.

Dateien: Open, Close, Read, Write

Ruby kann über einen bestimmten Satz an Methoden mit Dateien umgehen. Hier wollen wir uns die dafür notwendigen Methoden ansehen und Sie dann im folgenden Beispiel in der Praxis einsetzen.

Die relevanten Methoden von Ruby:

  • open —  Öffnet eine angegebene Datei
    Extraparameter:
    “w”  – für “Write”, öffnet die Datei im Schreibmodus, Datei kann beschrieben werden. Mit dem Plusmodifier (w+) ruft man die Datei im Lese und Schreibmodus auf.
    “r” – für “Read” öffnet die Datei im Lesemodus, Datei kann nur ausgelesen werden, sicherer, da Datei nicht versehentlich überschrieben werden kann. Mit dem Plusmodifier (r+) ruft man die Datei im Schreib- und Lesemodus auf.
    “a” für “Append” ermöglicht es an eine bestehende Datei weiteren Inhalt anzuhängen, ohne den bisherigen Inhalt zu löschen.
  • close — Schließt und speichert eine Datei
  • read — Liest den Inhalt einer Date. Inhalt kann einer Variable zugeordnet werden.
  • readline — Liest nur eine Zeile der Datei.
  • truncate — Kürzt oder leert die Datei.
  • write('Beispieltext') — Schreibt “Beispieltext” in die Datei.Nun sehen wir uns die Funktionen direkt im Beispiel, in Verbindung mit ARGV  an:

dateiarbeit.rb:

ruby dateiarbeit.rb ergibt dann folgende Ausgabe:

Abschließend erweitern wir unsere Datei nun um eine Kopierfunktion und  kürzen den Code ein wenig und machen Ihn somit (etwas) besser.

Bezüglich des Kürzens, nehmen wir die truncate (das Leeren der Datei) heraus, da wir durch den write modifier (‘w’) mit open(datei1, ‘w’) bereits die Datei im Schreibmodus öffnen und sie bei der Bearbeitung überschrieben wird.

Die vielen Zeilen dieses Abschnitts:

ersetzen wir durch, denn es ist unnötig für jede Zeile eine neue write Anweisung zu schreiben:

dateiarbeit2.rb:

Input über Argument Variablen ARGV

Mit ARGV kann man direkt beim Öffnen der Dateien Variablen übergeben. ARGV entpackt dann die Variablen der Reihe nach und stellt diese zur Verfügung.

Beispiel:

Wie gesagt werden die Variablen direkt mit dem Öffnen der Datei “befüllt”. Also starten wir das eben geschriebene Programm, wir nennen es einmal tiere.rb, wie folgt:

und erhalten als Ausgabe:

Wenn wir Variablen über ARGV direkt mit dem Starten des Programms abholen, so müssen wir andere Benutzereingaben, ein wenig anders als üblich ( gets.chomp() ) abholen: stdin.gets.chomp() muss nun verwendet werden um dem Benutzer eine Eingabe abzuverlangen. stdin steht hier für STandarDINput.

gets.chomp wird immer versuchen die Variablen von ARGV einzulesen, sofern ARGV verwendet wurde. stdin.gets.chomp sagt Ruby hingegen, auf herkömmlichem Weg nach der Eingabe zu fragen.

Für Methoden kann auch mit ARGV gearbeitet werden. Hier lautet der Befehl jedoch *args. Beispiel:

 

Absätze eines ganzen Paragraphen

Um einen ganzen Absatz, genau so auszugeben, wie er im Code hinterlegt wurde, gibt es eine angenehme Abkürzung.  Statt \n immer für Zeilenumbrüche zu sorgen, kann man den Textblock, wie er ausgegeben werden soll, auch mit führenden und beendenden “”” (drei Anführungszeichen) einleiten und abschließen.

Beispiel:

 

Escaping

Um verschiedene Zeichen in Strings darzustellen, gibt es Escaping Sequenzen. Wollen wir beispielsweise ein ” innerhalb eines Strings verwenden, so würde dies nicht gehen, da hier sonst für Ruby der String abbrechen würde:

Hier würde  Ruby die folgende Ausgabe bringen:

also alles zwischen dem ersten und dem zweiten ” .

stellt den Satz komplett dar, da die ” mit einem \ escaped wurden.

Hier die wichtigsten Escape Sequenzen:

\\ Backslash ()
\' Hochkomma(‘)
\" Anführungszeichen (“)
\t Horizontaler Tab
 \n  Neue Zeile (n steht für new line)

Vererbung

Syntax:

Über die Vererbung können wir Attribute und Methoden an eine weitere Klasse vererben.  < liest man hier als “erbt von”. Die beiden Klassen müssen in einer “is a” Beziehung zueinander stehen. Die Vererbende Klasse wird häufig auch als parent oder superclass bezeichnet, die Erben als child oder subclass.

Beispiel:

Wenn eine Klasse nun vererbt wurde, können eine oder mehrere Methdode und Attribute auch überschrieben werden, man spricht von einem Override. 

Beispiel:

Aber auch wenn wir Methoden und/oder Attribute überschrieben haben, können wir auf diese mit dem Befehl super wieder zugreifen:

Es wird deutlich wie super funktioniert: Wenn Ruby den Befehl super innerhalb einer Methode findet, so schaut Ruby in der superclass der gegenwärtigen Klasse nach ob es dort eine Methode findet, die den gleichen Namen trägt, wie die Methode in der es ausgeführt wird. Ruby benutzt dann die superclass Methode.

Mehrfache Vererbungen nicht möglich 

Beispiel:

Wir bedienen uns hier einer kleinen Abkürzung mit ; end, sodass wir alles in einer Zeile verfassen können.  Wir sehen an der Ausgabe, das Ruby es nicht zulässt, dass eine Klasse zweimal erbt. Dies wird erst mit mixins möglich.

Die vier Arten von Klassenvariablen

Der Scope (Answendungsbereich / Spielraum) einer Variable ist der Kontext in dem diese in einem Programm sichtbar wird. Nicht alle Variablen sind in allen Bereichen / im gesamten Code eines Programms verwendbar. Es gibt vier Arten von Variablen:

1. Globale Variablen

Diese Variablen sind im gesamten Code verfügbar. Sie können auf zwei Wegen erzeugt werden:  Entweder man definiert die Variable außerhalb einer Klasse oder Methode – dies macht die Variable automatisch global wirksam – oder aber (innerhalb einer Klasse oder Methode) werden Sie mit einem $ eingeleitet.

2. Lokale Variable

Diese Variablen sind nur in bestimmten Methoden verfügbar.

3. Klassenvariablen

Diese Variablen sind nur als Mitglied bestimmter Klassen verfügbar. Klassenvariablen gehören nicht zu einer einzelnen Instanz einer Klasse, sondern direkt zur Klasse selbst.
Syntax und gleichzeitig Konvention ist das einleitende @@.

Beispiel: Hier wird oberhalb der Instanz eine Klassenvariable @@anzahl_freunde erstellt. Die steht von Haus aus erst einmal auf 0.

4. Instanzvariablen

Diese Variablen sind nur für bestimmte Instanzen einer Klasse verfügbar.
Syntax und gleichzeitig Konvention ist das einleitende @.

Beispiel:

Hierbei sind die Variablen nur innerhalb der initialisierte Instanz von Nutzen.

Selbiges gilt ebenso für Methoden: Auch hier gibt es Methoden, die nur in bestimmten Klassen oder Instanzen verfügbar sind. So können wir ein neues Objekt erschaffen, welches die initialisierten Datensätze enthält:

 

 

Klassen in Ruby

Eine Klasse ist ein Weg Objekte zu organisieren und zu produzieren, die ähnliche Attribute und Methode innehaben.

“etactic” ist ein String
“etactic”.length ist ein String mit der Methode length.
7 ist das length – Attribut des  Strings “etactic”.

“etactic” ist eine Instanz der String-Klasse.   Doch was bedeutet “Klasse”? Eine Klasse ist dazu da Objekte mit ähnlichen Methoden und Attributen zu organisieren und zu produzieren.

Ein Beispiel:

Der Klassenname

Der Klassenname im Beispiel ist Musikerstücke – eingeleitet mit Class MusikerStücke. Musikerstücke hat nun die Fähigkeit weitere Rubyobjekte zu erstellen, die dann in eben dieser Klasse enthalten sind. Die Konventionen für den Klassennamen besagen, dass dieser mit einem Großbuchstabe eingeleitet wird und im sogenannten CamelCase  ausgeschrieben werden, statt mittels_unterstrichen_getrennt zu werden.

Initialize

Mit Initialize booten wir sozusagen die Objekte unserer neuen Klasse. In Klammern geben wir an welche Instanzvariablen unsere Klasse hat (dazu gleich mehr)

Instanzvariablen

Um Ruby zu zeigen, dass es sich um eine Instanzvariable handelt, verwenden wir ein @ vor dem Name. Dies würde dann in unserem Beispiel so aussehen:

Dies bindet die Variable an die Instanz der Klasse. So können wir nun eine neue Variable mit Hilfe dieser Klasse erstellen und auf die Instanzvariablen zugreifen:

Die Variable xbox bedient sich der Struktur der Klasse Konsolen, die die Instanzvariablen  @name und @prozessor vorgibt. So könnten wir nun durch die in der Klasse definierte Methode info mittels xbox.info

ausgeben.

Unterschied zwischen Proc und Lambda

Ein Proc ist ein Block der gespeichert wurde und wieder und wieder verwendet werden kann. Ein Proc gibt diese gespeicherten Blöcke sofort bei Aufruf des Blocks aus.

Ein Lambda macht genau, dasselbe arbeitet aber ein wenig anders: Es berücksichtigt die Anzahl an Arguments, die übergeben werden.  Weiterhin priorisiert ein Lambda die Calling.Methode gegenüber der direkten Ausgabe über ein return (wie es bei Proc der Fall ist).

Beispiel

 

Lambda – Procs mit anderer Syntax

Aus Phyton mag der ein oder andere die bequemen Lambdas kennen, diese gibt es auch by Ruby. Wie so oft kann man fast alles auf verschiedenen Wegen herbeiführen. Ein Lambda kann genau wie Proc eingesetzt werden, nur muss eine andere Syntax verwendet werden und es gibt noch einen weiteren Unterschied der Proc und Lambda unterscheiden.

Beispiel:

Im Vergleich hierzu das ganze mit Procs:

Doch nun zurück zu unseren Lambdas und Ihrer Syntax. Ein Beispiel wie wir alle Stringwerte eines Arrays in Symbole umwandeln können:

Was passiert hier?

In “strings” sind 4 Engelsnamen gespeichert. symbolize ist unsere neue Variable die unser Lambda enthält, welches in geschweiften Klammern definiert: x (also jeder einzelne String aus strings) ist der Parameter, der bearbeitet werden soll. .to_sym ist die Methode die auf diesen Parameter angewendet wird. Diese Methode verwandelt die Parameter auf die es angewant wird in Symbole.

Die letzte Zeile erstellt ein neues Array, indem es strings aufgreift, mit collect die darin enthaltenen Strings einsammelt und mit (&symbolize)(unserem zuvor erstellten Lambda, dass durch diese Syntax angewendet wird) zu Symbolen macht. Von nun an können wir auch weitere, spätere Strings mit (&symbolize) zu Symbolen machen.