Je suis nouveau en programmation. Quelqu'un peut-il expliquer ce .map
qui ferait:
params = (0...param_count).map
ruby
map
range
enumeration
grosse Pomme de terre
la source
la source
map
est une méthode "fonctionnelle" courante trouvée sur les objets Enumerable utilisés pour transformer les valeurs dans une séquence (avec des considérations spéciales)...
et...
sont des moyens de créer des plages. De plus, familiarisez-vous avec le REPL, où vous pouvez essayer ce genre de choses vous-même! :)Réponses:
La
map
méthode prend un objet énumérable et un bloc, et exécute le bloc pour chaque élément, produisant chaque valeur retournée à partir du bloc (l'objet d'origine est inchangé sauf si vous utilisezmap!)
:Array
etRange
sont des types énumérables.map
avec un bloc renvoie un tableau.map!
mute le tableau d'origine.Où est-ce utile et quelle est la différence entre
map!
eteach
? Voici un exemple:Le résultat:
la source
map
comme si elle étaitmap!
map
, avecselect
eteach
est l'un des chevaux de bataille de Ruby dans mon code.Il vous permet d'exécuter une opération sur chacun des objets de votre tableau et de les renvoyer tous au même endroit. Un exemple serait d'incrémenter un tableau de nombres de un:
Si vous pouvez exécuter une seule méthode sur les éléments de votre tableau, vous pouvez le faire dans un style abrégé comme ceci:
Pour ce faire avec l'exemple ci-dessus, vous devez faire quelque chose comme ça
Pour utiliser plus simplement la technique du raccourci esperluette, utilisons un autre exemple:
La transformation de données dans Ruby implique souvent une cascade d'
map
opérations. Etudiezmap
&select
, ce sont quelques-unes des méthodes Ruby les plus utiles de la bibliothèque principale. Ils sont tout aussi importants queeach
.(
map
est également un alias pourcollect
. Utilisez ce qui vous convient le mieux conceptuellement.)Plus d'informations utiles:
Si l' objet Enumerable que vous exécutez
each
oumap
sur contient un ensemble d'éléments Enumerable (hachages, tableaux), vous pouvez déclarer chacun de ces éléments à l'intérieur de vos canaux de blocs comme suit:Dans le cas d'un Hash (également un
Enumerable
objet, un Hash est simplement un tableau de tuples avec des instructions spéciales pour l'interpréteur). Le premier "paramètre de tuyau" est la clé, le second est la valeur.Pour répondre à la vraie question:
En supposant qu'il
params
s'agit d'un hachage, ce serait la meilleure façon de le mapper: utilisez deux paramètres de bloc au lieu d'un pour capturer la paire clé / valeur pour chaque tuple interprété dans le hachage.la source
NoMethodError: private method 'plusone' called for 1:Fixnum
en rubis 2 et «mauvais nombre d'arguments» en rubis 1.9 / 1.8. Quoi qu'il en soit, j'ai utilisé un lambda:plusone = ->(x) { x + 1 }
prenez le spécificateur symbole:[1,2,3].map(&plusone)
.private
intérieur de la classe où vous avez mis votre méthode avant de mettre votre méthodeEn utilisant ruby 2.4, vous pouvez faire la même chose en utilisant
transform_values
cette fonctionnalité extraite des rails vers ruby.la source
0..param_count
signifie "jusqu'à et y compris param_count".0...param_count
signifie "jusqu'à, mais sans inclure param_count".Range#map
ne renvoie pas unEnumerable
, il le mappe en fait sur un tableau. C'est la même chose queRange#to_a
.la source
Il "mappe" une fonction à chaque élément d'une
Enumerable
- dans ce cas, une plage. Ainsi, il appellerait le bloc passé une fois pour chaque entier de 0 àparam_count
(exclusif - vous avez raison sur les points) et retournerait un tableau contenant chaque valeur de retour.Voici la documentation de
Enumerable#map
. Il a également un alias,collect
.la source
Range#map
convertit en fait en tableau.Enumerable
, comme chacun. Je pensais que oui.La carte fait partie du module énumérable. Très similaire à "collecter" Par exemple:
La carte fournit des valeurs itératives à travers un tableau qui sont retournées par les paramètres de bloc.
la source
#each
#each
exécute une fonction pour chaque élément d'un tableau. Les deux extraits de code suivants sont équivalents:#map
#map
applique une fonction à chaque élément d'un tableau, renvoyant le tableau résultant. Les éléments suivants sont équivalents:#map!
#map!
est comme#map
, mais modifie le tableau en place. Les éléments suivants sont équivalents:la source