Die Artikel RubyWiki:FAQ und Pitfalls überschneiden sich inhaltlich. Bitte hilf mit, das zu verbessern, indem du die Artikel unter einem Namen zusammenführst. Hier eine Sammlung von beliebten Fettnäpfchen, die Ruby für einen aufgestellt hat. Rückgabewert von Bang-MethodenMethoden, die mit einem Ausrufezeichen enden, verändern das Objekt selbst. Typischerweise geben sie den Wert des Objekts zurück, z.B. bei String#strip!. Wenn strip! jedoch keine Ersetzung durchführt, wird
Es ist also oft keine gute Idee, Return-Werte von !-Methoden zu verwenden. SyntaxError am Ende der DateiWenn man irgendwo mal ein Was hier hilft, ist ein Editor mit automatischer Einrückung (z. B. Vim oder auch Emacs). Seit Ruby 1.9 meckert Ruby auch, wenn bei angegebener Verschachtelte Module/KlassenWerden verschachtelte Module oder Klassen mit der
Der Grund hierfür ist, dass die Notation "module A::B" nur den Namensbereich (Scope) des Moduls A::B öffnet. Im ersten Beispiel dagegen wird zuerst der Namensbereich des Moduls A, dann jener des Moduls B geöffnet. Kein ++ Operator (Post und Pre increment/decrement)Ruby als OOP-Sprache will nicht zu viel Code-Misch-Masch, Stichwort: Eleganz. Matz meinte, daß der ++ Operator wenig Sinn in Ruby macht, d.h. jeder Aufruf einer Methode geschieht in Form einer Message (wie
Dies funktioniert jedoch nicht:
Hier ein Link dazu: http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/52956 Integer-Arithmetik bei negativen Zahlen...verhält sich anders, als von Sprachen wie C/C++, PHP oder Java gewohnt.
Mathematisch gesehen ist dieses Verhalten aber korrekt. Auch Python und TCL verhalten sich da genau so. Es muss immer die floor-Bedingung erfüllt sein: "Der größte Integerwert der aber kleiner-gleich dem Float-Ergebnis ist."
Also ist -10/9 = 10/-9 = -2 , da -2 < (-10.0/9.0=10.0/-9.0=-1,111) < -1. Modulo: a modulo b = Rest => a = a/b * b + Rest , mit a/b = (a.to_f / b.to_f).floor a modulo b = Rest = a - a/b * b -10 % 9 = -10 - -2 * 9 = -10 + 18 = 8 10 % -9 = 10 - -2 * -9 = 10 - 18 = -8 Für Umsteiger gibt es neben % und divmod() noch remainder(), welches sich wie Weblinks:
0 in Ruby ist trueIn Ruby sollte man mit
Leerstellen machen den UnterschiedEin Beispiel, bei dem eine Leerstelle das Ergebnis verändert:
Der Grund liegt in der Art, wie Ruby den Code zerlegt: Anmerkung: Man sollte niemals die internen mathematischen Funktionen überschreiben, es sei denn, man braucht ein pathologisches Beispiel. Deep Copies und ReferenzenAls typische OO-Sprache ist (fast) alles in Ruby ein Objekt? - Nein! Eine Referenz auf ein Objekt!
Der Zuweisungsoperator "=" bezieht sich nur auf die Referenz. Genauso läuft das mit Übergaben an Argumente in Methoden:
Im Allgemeinen gibt es zwei Verfahren für "Deep Copies":
Bei Sprachen mit Memory Management wie Ruby oder Java wird meistens nur das letztere Verfahren realisiert. Bei Deep Copies entsteht also immer eine neue Referenz! Die allgemeinen Methoden für Deep Copies sind Methoden der Klasse
"Call by reference", "Call by value" und mehrere Rückgabewerte bei MethodenWer von anderen, "alten" Sprachen wie C++ oder Pascal/Delphi kommt, der wird gewohnt sein, manchmal mehr als einen Funktionswert via Call by reference - Argumente zurückzugeben. Nun liest man überall, dass Ruby ebenfalls "Call by reference" macht. Also muss das ja klappen:
Worin liegt das Problem? Nun, bei "s2='123'" ist eine neue Referenz erzeugt worden. Die Referenzen im Argument von f() können aber nicht verändert werden. Insofern pflegt Ruby, was Referenzen anbelangt, "Call by value"! s2 zeigt nach dem Aufruf unverändert auf den alten - leeren - String. Es gibt für einige Klassen Methoden die nur den inhalt austauschen, ohne das Objekt neu zu zuweisen.
Vergleiche mit ==In Ruby werden Vergleiche mit dem ==-Operator ausgeführt, nicht mit =. Das führt oft zu unerwarteten Ergebnissen:
Was ist passiert? = hat eine Zuweisung ausgelöst und so der Variablen
Dateipfade auf WindowsWindows verwendet ja bekannterweise Backslashes zum Trennen von Pfadelementen, z.B. C:\Dokumente und Einstellungen\Ich\Eigene Dateien. Ruby interpretiert Backslashes in normalen Strings mit doppelten Anführungszeichen als Sonderzeichensequenzen. Daher sollte man besser normale Slashes / verwenden, sie werden von Ruby automatisch umgewandelt. Alternativ lassen sich auch doppelte Backslashes \\ verwenden, aber diese sind nicht über verschiedene Plattformen hinweg kompatibel.
$: enthält das aktuelle Verzeichnis nichtSeit Ruby 1.9.2 enthält die spezielle globale Variable $: das aktuelle Arbeitsverzeichnis (».«) nicht mehr. Das bedeutet, dass Skripte, die im gleichen Verzeichnis liegen wie das ausführende Skript, nicht von require gefunden werden. Lösung: Statt require, welches seit 1.9.2 nur noch zum Laden von Bibliotheken aus System-Installationsorten zuständig ist, require_relative verwenden. Beispiel: Wir haben folgende Dateistruktur:
Will mein_skript.rb die zwei anderen Skripte per require einbinden, so muss es so aussehen:
Siehe auch |
||||||||||||||||||||||||||||||||||||||||||||||||||||||