Eu sou novo em programação. Alguém pode explicar o .map
que faria em:
params = (0...param_count).map
ruby
map
range
enumeration
bigpotato
fonte
fonte
map
é um método "funcional" comum encontrado em objetos enumeráveis usados para transformar os valores em uma sequência (com considerações especiais)...
e...
são maneiras de criar intervalos. Além disso, familiarize-se com o REPL, onde você pode experimentar você mesmo! :)Respostas:
O
map
método pega um objeto enumerável e um bloco e executa o bloco para cada elemento, produzindo cada valor retornado do bloco (o objeto original é inalterado, a menos que você usemap!)
:Array
eRange
são tipos enumeráveis.map
com um bloco retorna uma matriz.map!
muda a matriz original.Onde isso é útil e qual a diferença entre
map!
eeach
? Aqui está um exemplo:A saída:
fonte
map
como se fossemap!
map
, junto comselect
eeach
é um dos cavalos de trabalho de Ruby no meu código.Permite executar uma operação em cada um dos objetos da sua matriz e devolvê-los todos no mesmo local. Um exemplo seria incrementar uma matriz de números em um:
Se você pode executar um único método nos elementos da sua matriz, pode fazê-lo em um estilo abreviado, como segue:
Para fazer isso com o exemplo acima, você teria que fazer algo assim
Para usar mais simplesmente a técnica de atalho "e comercial", vamos usar um exemplo diferente:
A transformação de dados no Ruby geralmente envolve uma cascata de
map
operações. Studymap
&select
, eles são alguns dos métodos Ruby mais úteis na biblioteca principal. Eles são tão importantes quantoeach
.(
map
também é um apelido paracollect
. Use o que for melhor para você conceitualmente.)Informações mais úteis:
Se o objeto Enumerable em que você estiver executando
each
oumap
contiver um conjunto de elementos Enumerable (hashes, matrizes), você poderá declarar cada um desses elementos dentro de seus tubos de bloco da seguinte maneira:No caso de um Hash (também um
Enumerable
objeto, um Hash é simplesmente uma matriz de tuplas com instruções especiais para o intérprete). O primeiro "parâmetro do tubo" é a chave, o segundo é o valor.Para responder à pergunta real:
Supondo que
params
seja um hash, essa seria a melhor maneira de mapear através dele: use dois parâmetros de bloco em vez de um para capturar o par de chave e valor para cada tupla interpretada no hash.fonte
NoMethodError: private method 'plusone' called for 1:Fixnum
no ruby 2 e 'número errado de args' no ruby 1.9 / 1.8. De qualquer forma, eu usei um lambda:plusone = ->(x) { x + 1 }
seguida, retire o símbolo especificador:[1,2,3].map(&plusone)
.private
dentro da classe onde você colocar o seu método antes de você colocar o seu métodoUsando o ruby 2.4, você pode fazer o mesmo, usando
transform_values
esse recurso extraído dos trilhos para o ruby.fonte
0..param_count
significa "até e incluindo param_count".0...param_count
significa "até, mas não incluindo param_count".Range#map
não retorna umEnumerable
, na verdade ele mapeia para uma matriz. É o mesmo queRange#to_a
.fonte
Ele "mapeia" uma função para cada item em um
Enumerable
- nesse caso, um intervalo. Portanto, chamaria o bloco passado uma vez para cada número inteiro de 0 aparam_count
(exclusivo - você está certo sobre os pontos) e retornaria uma matriz contendo cada valor de retorno.Aqui está a documentação para
Enumerable#map
. Também possui um aliascollect
,.fonte
Range#map
na verdade converte para uma matriz.Enumerable
, como cada um. Eu pensei que sim.O mapa é uma parte do módulo enumerável. Muito parecido com "collect". Por exemplo:
O mapa fornece valores iterativos por meio de uma matriz retornada pelos parâmetros do bloco.
fonte
#each
#each
executa uma função para cada elemento em uma matriz. Os dois trechos de código a seguir são equivalentes:#map
#map
aplica uma função a cada elemento de uma matriz, retornando a matriz resultante. Os seguintes são equivalentes:#map!
#map!
é como#map
, mas modifica a matriz no lugar. Os seguintes são equivalentes:fonte