Kurzform für Funktionen zum Zuordnen

7

In map kann ich eine Methode für den übergebenen Wert mit der praktischen &: -Notation aufrufen:

%Vor%

Gibt es etwas Ähnliches zum Aufrufen einer Funktion mit dem Wert, der als erstes Argument übergeben wurde?

%Vor%     
Vlad the Impala 24.02.2012, 20:39
quelle

4 Antworten

8

benutze dies:

%Vor%

aber eigentlich ist es nicht viel kürzer:)

    
Vasiliy Ermolovich 24.02.2012, 20:49
quelle
10

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.

Verständnis von 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.

%Vor%

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.

Ändern, um nums.each(&:puts) zu aktivieren

Wir könnten to_proc einfach anders implementieren, um anders zu handeln. Hier ist ein kurzes Beispiel.

%Vor%

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.

Verständnis von 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.

Implementieren von 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%     
quelle
2

Nicht ganz ähnlich, aber wie wäre es:

%Vor%     
Roadmaster 24.02.2012 20:41
quelle
0

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%     
Uri Agassi 03.06.2014 09:10
quelle

Tags und Links