Bücher online kostenlos Kostenlos Online Lesen
Die Programmiersprache Ruby (German Edition)

Die Programmiersprache Ruby (German Edition)

Titel: Die Programmiersprache Ruby (German Edition) Kostenlos Bücher Online Lesen
Autoren: David Flanagan , Yukihiro Matsumoto
Vom Netzwerk:
Verhalten, während Lambdas ein methodenähnliches Verhalten haben. Beide sind jedoch Instanzen der Klasse
Proc
.
    Die nachfolgenden Unterabschnitte erläutern,
    wie man Proc-Objekte erzeugt, sowohl in der Proc- als auch in der Lambda-Form,
wie man
Proc
-Objekte aufruft,
wie man ermittelt, wieviele Argumente eine
Proc
erwartet,
wie man ermittelt, ob zwei
Proc
-Objekte identisch sind und
wie sich Procs und Lambdas voneinander unterscheiden.
    6.5.1 Procs erzeugen
    Wir haben bereits eine Möglichkeit gesehen, ein
Proc
-Objekt zu erzeugen, nämlich indem Sie einen Block mit einer Methode verknüpfen, deren Parameter-Definition ein Blockargument mit Und-Zeichen-Präfix enthält. Nichts hindert eine solche Methode daran, das
Proc
-Objekt zur Verwendung außerhalb der Methode zurückzugeben:
# Diese Methode erzeugt eine Proc aus einem Block.
def makeproc(&p) # Den verknüpften Block mit einer Proc verknüpfen und in p speichern
p # Das Proc-Objekt zurückgeben
end
    Durch die Definition einer
makeproc
-Methode wie dieser können wir ein
Proc
-Objekt für den eigenen Gebrauch erzeugen:
adder = makeproc {|x,y| x+y }
    Die Variable
adder
verweist nun auf ein
Proc
-Objekt.
Proc
-Objekte, die auf diese Weise erzeugt werden, sind Procs, keine Lambdas. Alle
Proc
-Objekte haben eine
call
-Methode, die bei Aufruf den Code ausführt, der in dem Block enthalten ist, aus dem die Proc erzeugt wurde, zum Beispiel
sum = adder.call(2,2) # => 4
    Proc
-Objekte können nicht nur aufgerufen werden, sondern auch an Methoden übergeben, in Datenstrukturen gespeichert und auf andere Weise wie jedes andere Ruby-Objekt manipuliert werden.
    Neben der Erzeugung von Procs durch Methodenaufruf gibt es drei Methoden, die in Ruby
Proc
-Objekte (sowohl Procs als auch Lambdas) erzeugen. Diese Methoden werden üblicherweise genutzt, und es ist eigentlich nicht nötig, eine
makeproc
-Methode wie die oben gezeigte zu definieren. Zusätzlich zu diesen
Proc
-Erzeugungsmethoden unterstützt Ruby 1.9 noch eine neue Literalsyntax zur Definition von Lambdas. Die nachfolgenden Unterabschnitte besprechen die Methoden
Proc.new
,
lambda
und
proc
und erläutern zudem die Lambda-Literalsyntax in Ruby 1.9.
    6.5.1.1 Proc.new
    Wir haben
Proc.new
bereits in einigen früheren Beispielen in diesem Kapitel im Einsatz gesehen. Es ist die normale
new
-Methode, die die meisten Klassen unterstützen; dies ist die offensichtlichste Möglichkeit, eine neue Instanz der Klasse
Proc
zu erzeugen.
Proc.new
erwartet keine Argumente und liefert ein
Proc
-Objekt zurück, das eine Proc (und kein Lambda) ist. Wenn Sie
Proc.new
mit einem verknüpften Block aufrufen, liefert das eine Proc zurück, die den Block repräsentiert, zum Beispiel
p = Proc.new {|x,y| x+y }
    Wenn
Proc.new
ohne Block aus einer Methode heraus aufgerufen wird, mit der ein Block verknüpft ist, dann wird eine Proc zurückgegeben, die den mit der enthaltenden Methode verknüpften Block repräsentiert. Die Verwendung von
Proc.new
auf diese Weise stellt eine Alternative zur Verwendung eines Blockarguments mit Und-Zeichen-Präfix in einer Methodendefinition dar. Die folgenden beiden Methoden sind beispielsweise äquivalent:
def invoke(&b) def invoke
b.call Proc.new.call
end end
    6.5.1.2 Kernel.lambda
    Ein weiteres Verfahren zum Erzeugen von
Proc
-Objekten bietet die Methode
lambda
.
lambda
ist eine Methode des Moduls
Kernel
, verhält sich also wie eine globale Funktion. Wie der Name vermuten lässt, ist das von dieser Methode zurückgegebene
Proc
-Objekt ein Lambda und keine Proc.
lambda
erwartet keine Argumente, aber mit dem Aufruf muss ein Block verknüpft sein:
is_positive = lambda {|x| x > 0 }
    ----
    Lambda-Geschichte
    Lambdas und die Methode
lambda
haben ihren Namen von der Lambda-Algebra , einem Teilgebiet der mathematischen Logik, das auf funktionale Programmiersprachen angewendet wird. Lisp verwendet ebenfalls den Begriff »Lambda« für Funktionen, die als Objekte manipuliert werden können.
    ----
    6.5.1.3 Kernel.proc
    In Ruby 1.8 ist die globale Methode
proc
ein Synonym für
lambda
. Trotz ihres Namens gibt sie ein Lambda und keine Proc zurück. Ruby 1.9 korrigiert das; in dieser Version der Sprache ist
proc
ein Synonym für
Proc.new
.
    Wegen dieser Mehrdeutigkeit sollten Sie
proc
niemals in Ruby 1.8-Code verwenden. Das Verhalten Ihres Codes könnte sich ändern, wenn der Interpreter auf eine neue Version aktualisiert wird. Wenn Sie Ruby 1.9-Code verwenden und sicher sein können, dass er niemals von einem Ruby

Weitere Kostenlose Bücher