Ich bin neu in der Programmierung. Kann jemand erklären, was .map
in tun würde:
params = (0...param_count).map
ruby
map
range
enumeration
Bigpotato
quelle
quelle
map
ist eine gebräuchliche "funktionale" Methode für Enumerable-Objekte, die zum Transformieren der Werte in einer Sequenz verwendet werden (mit besonderen Überlegungen)...
und...
sind Möglichkeiten, Bereiche zu erstellen. Auch vertraut mit dem REPL, wo Sie das Zeug selbst ausprobieren können! :)Antworten:
Die
map
Methode verwendet ein aufzählbares Objekt und einen Block und führt den Block für jedes Element aus, wobei jeder zurückgegebene Wert aus dem Block ausgegeben wird (das ursprüngliche Objekt bleibt unverändert, es sei denn, Sie verwendenmap!)
:Array
undRange
sind unzählige Typen.map
mit einem Block gibt ein Array zurück.map!
mutiert das ursprüngliche Array.Wo ist das hilfreich und was ist der Unterschied zwischen
map!
undeach
? Hier ist ein Beispiel:Die Ausgabe:
quelle
map
als wäre esmap!
map
, zusammen mitselect
undeach
ist eines von Rubys Arbeitspferden in meinem Code.Sie können damit eine Operation für jedes Objekt Ihres Arrays ausführen und alle an derselben Stelle zurückgeben. Ein Beispiel wäre, ein Array von Zahlen um eins zu erhöhen:
Wenn Sie eine einzelne Methode für die Elemente Ihres Arrays ausführen können, können Sie dies in einer Kurzform wie folgt tun:
Um dies mit dem obigen Beispiel zu tun, müssten Sie so etwas tun
Um die kaufmännische Und-Verknüpfungstechnik einfacher zu verwenden, verwenden wir ein anderes Beispiel:
Das Transformieren von Daten in Ruby ist häufig mit einer Kaskade von
map
Vorgängen verbunden. Studymap
&select
, sie sind einige der nützlichsten Ruby-Methoden in der Primärbibliothek. Sie sind genauso wichtig wieeach
.(
map
ist auch ein Alias fürcollect
. Verwenden Sie konzeptionell das, was für Sie am besten funktioniert.)Weitere hilfreiche Informationen:
Wenn das Enumerable- Objekt, das Sie ausführen
each
odermap
auf dem Sie arbeiten, eine Reihe von Enumerable-Elementen (Hashes, Arrays) enthält, können Sie jedes dieser Elemente in Ihren Blockpipes wie folgt deklarieren:Im Fall eines Hash (auch ein
Enumerable
Objekt, ist ein Hash einfach ein Array von Tupeln mit speziellen Anweisungen für den Interpreter). Der erste "Pipe-Parameter" ist der Schlüssel, der zweite ist der Wert.Um die eigentliche Frage zu beantworten:
Angenommen, es
params
handelt sich um einen Hash, ist dies der beste Weg, um ihn abzubilden: Verwenden Sie zwei Blockparameter anstelle von einem, um das Schlüssel-Wert-Paar für jedes interpretierte Tupel im Hash zu erfassen.quelle
NoMethodError: private method 'plusone' called for 1:Fixnum
in Rubin 2 und 'falsche Anzahl von Argumenten' in Rubin 1.9 / 1.8. Wie auch immer, ich habe ein Lambda verwendet:plusone = ->(x) { x + 1 }
Nehmen Sie dann den Symbolbezeichner heraus :[1,2,3].map(&plusone)
.private
innerhalb der Klasse deklariert, in der Sie Ihre Methode abgelegt haben, bevor Sie Ihre MethodeMit Ruby 2.4 können Sie dasselbe tun, indem Sie
transform_values
diese Funktion von Schienen zu Ruby extrahieren.quelle
0..param_count
bedeutet "bis einschließlich param_count".0...param_count
bedeutet "bis zu, aber ohne param_count".Range#map
gibt kein zurückEnumerable
, sondern ordnet es tatsächlich einem Array zu. Es ist das gleiche wieRange#to_a
.quelle
Es "ordnet" jedem Element in einem
Enumerable
- in diesem Fall einem Bereich - eine Funktion zu . Es würde also den Block, der einmal für jede Ganzzahl von 0 bis übergeben wurdeparam_count
(exklusiv - Sie haben Recht mit den Punkten), aufrufen und ein Array zurückgeben, das jeden Rückgabewert enthält.Hier ist die Dokumentation für
Enumerable#map
. Es hat auch einen Aliascollect
.quelle
Range#map
konvertiert es aber tatsächlich in ein Array.Enumerable
wie jede eine zurückgab. Ich dachte es wäre so.Map ist Teil des Aufzählungsmoduls. Sehr ähnlich zu "sammeln" Zum Beispiel:
Map bietet Werte, die durch ein Array iterieren und von den Blockparametern zurückgegeben werden.
quelle
#each
#each
führt eine Funktion für jedes Element in einem Array aus. Die folgenden zwei Code-Auszüge sind äquivalent:#map
#map
Wendet eine Funktion auf jedes Element eines Arrays an und gibt das resultierende Array zurück. Folgendes ist äquivalent:#map!
#map!
ist wie#map
, ändert aber das Array an Ort und Stelle. Folgendes ist äquivalent:quelle