In map
kann ich eine Methode für den übergebenen Wert mit der praktischen &:
-Notation aufrufen:
Gibt es etwas Ähnliches zum Aufrufen einer Funktion mit dem Wert, der als erstes Argument übergeben wurde?
%Vor%benutze dies:
%Vor%aber eigentlich ist es nicht viel kürzer:)
Haftungsausschluss: Dieser Beitrag ist rein lehrreich. nums.each {|n| puts n}
ist wirklich die einzige vernünftige Sache, um in einem echten Projekt zu schreiben.
nums.map(&:to_s)
Die bestehende Kurzform funktioniert sehr einfach. &
ruft to_proc
für das Symbol auf, und to_proc
für ein Symbol ist wie folgt definiert.
Da dieser Prozess sich wie ein regulärer Block verhält, der in map übergeben wird, ist *args
in diesem Fall wirklich jedes Element, das wir durchlaufen. Wir nehmen den ersten von Argumenten (da *
Argumente in ein Array umwandelt) und senden self
an sie, wobei self
das tatsächliche Symbol ist, beispielsweise :to_s
. Verbleibende Argumente werden übergeben. Es ist also wie nums.map{ |*args| args.shift.__send__(:to_s, *args) }
zu sagen.
nums.each(&:puts)
zu aktivieren
Wir könnten to_proc
einfach anders implementieren, um anders zu handeln. Hier ist ein kurzes Beispiel.
Anstatt den Symbolnamen als Nachricht an das Element zu senden, rufen wir einfach das Symbol als Methode für den aktuellen Kontext auf und übergeben einfach das iterierte Element als Argument an das Element.
Es ist also eher wie (1..10).each{|*args| __send__(:print, *args)}
zu sagen.
nums.each(&method(:puts))
Das heißt, als Nash darauf hingewiesen hat, könntest du nums.each(&method(:puts))
aufrufen. Was passiert, ist, dass Sie ein Objekt erhalten, das die Methode puts
mit der Methode method
von Ruby darstellt. Also ruft &
.to_proc
für das Methodenobjekt auf und verwandelt es in proc, das selbst die Rolle des Blocks spielt, der in each
(oder map
) übergeben wurde. Die an diesen proc übergebenen Argumente (jedes Element, das du iterierst) werden dann zu den Argumenten dieser Methode. Ordentlich.
xargs
Um ein Überschreiben des Standardverhaltens zu vermeiden, könnten wir unsere eigene xargs-Funktion wie beim Shell-Scripting hypothetisch implementieren. (Tu das nicht zu Hause - schlau ist schlecht.)
%Vor% Eigentlich, wenn puts
ein Array erhält , druckt jedes Element in einer neuen Zeile ...
Schreibt die angegebenen Objekte wie bei IO # print in ios. Schreibt einen Datensatz Trennzeichen (in der Regel ein Zeilenumbruch) nach denen, die noch nicht enden eine Newline-Sequenz. Wenn es mit einem Array-Argument aufgerufen wird, schreibt jedes Element in einer neuen Zeile . Wenn sie ohne Argumente aufgerufen wird, gibt sie einen einzelnen aus Trennzeichen aufzeichnen.
Also ...
%Vor%Tags und Links ruby functional-programming