O que faz o método" mapa " em Ruby?
.map
faria em:
params = (0...param_count).map
6 answers
O método map
toma um objecto enumerável e um bloco, e executa o bloco para cada elemento, expondo cada valor devolvido do bloco (o objecto original não é alterado a menos que use map!)
:
[1, 2, 3].map { |n| n * n } #=> [1, 4, 9]
Array
e Range
são tipos enumeráveis. map
com um bloco devolve uma matriz. map!
muda a matriz original.
Onde é que isto é útil, e qual é a diferença entre map!
e each
? Aqui está um exemplo:
names = ['danil', 'edmund']
# here we map one array to another, convert each element by some rule
names.map! {|name| name.capitalize } # now names contains ['Danil', 'Edmund']
names.each { |name| puts name + ' is a programmer' } # here we just do something with each element
A saída:
Danil is a programmer
Edmund is a programmer
map
, juntamente com select
e each
é um dos cavalos de trabalho da Ruby no meu código.
[1,2,3].map {|x| x + 1 }
#=> [2,3,4]
Se você pode executar um único método nos elementos do seu array você pode fazê-lo em um estilo abreviado como assim:
-
Para fazer isso com o exemplo acima você teria que fazer algo como este
class Numeric def plusone self + 1 end end [1,2,3].map(&:plusone) #=> [2,3,4]
-
Para mais simplesmente usar a técnica de atalho ampers e, vamos usar um exemplo diferente:
["vanessa", "david", "thomas"].map(&:upcase) #=> ["VANESSA", "DAVID", "THOMAS"]
A transformação de dados em Ruby envolve muitas vezes uma cascata de operações map
. Estudo map
& select
, eles são alguns dos métodos de Ruby mais úteis na biblioteca primária. Eles são tão importantes como each
.
(map
é também um pseudónimo de collect
. Usa o que funcionar melhor para ti conceptualmente.)
Mais útil informação:
Se o objecto enumerável em que está a correr each
ou map
contém um conjunto de elementos enumeráveis (traços, matrizes), pode declarar cada um desses elementos dentro dos seus tubos de blocos como assim:
[["audi", "black", 2008], ["bmw", "red", 2014]].each do |make, color, year|
puts "make: #{make}, color: #{color}, year: #{year}"
end
# Output:
# make: audi, color: black, year: 2008
# make: bmw, color: red, year: 2014
No caso de uma Hash (também um objeto Enumerable
, Uma Hash é simplesmente um conjunto de tuplas com instruções especiais para o interpretador). O primeiro "parâmetro pipe" é a chave, o segundo é o valor.
{:make => "audi", :color => "black", :year => 2008}.each do |k,v|
puts "#{k} is #{v}"
end
#make is audi
#color is black
#year is 2008
Para responder ao real pergunta:
Assumindo que params
é um hash, esta seria a melhor maneira de mapear através dele: Use dois parâmetros de bloco em vez de um para capturar o par chave e valor para cada tupla interpretada no hash.
params = {"one" => 1, "two" => 2, "three" => 3}
params.each do |k,v|
puts "#{k}=#{v}"
end
# one=1
# two=2
# three=3
0..param_count
significa"número de param_count até e incluindo".
0...param_count
significa "até, mas não incluindo o número de param_count".
Range#map
não devolve um Enumerable
, Na verdade mapeia-o para uma matriz. É o mesmo que Range#to_a
.
Usando o ruby 2.4, pode fazer a mesma coisa usando {[[1]}, Esta funcionalidade extraída dos carris para o ruby.
h = {a: 1, b: 2, c: 3}
h.transform_values { |v| v * 10 }
#=> {a: 10, b: 20, c: 30}
Ele "mapeia" uma função para cada item em um {[[0]} - Neste caso, um intervalo. Assim, ele chamaria o bloco passado uma vez para cada inteiro de 0 a param_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 tem um nome falso, collect
.
O mapa é uma parte do módulo enumerável. Muito semelhante a "recolher", por exemplo:
Class Car
attr_accessor :name, :model, :year
Def initialize (make, model, year)
@make, @model, @year = make, model, year
end
end
list = []
list << Car.new("Honda", "Accord", 2016)
list << Car.new("Toyota", "Camry", 2015)
list << Car.new("Nissan", "Altima", 2014)
p list.map {|p| p.model}
O mapa fornece valores iterando através de um array que são devolvidos pelos parâmetros do bloco.