O que faz o método" mapa " em Ruby?

Sou novo na programação. Alguém pode explicar o que .map faria em:

params = (0...param_count).map
Author: Danil Speransky, 2012-08-23

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
 401
Author: Danil Speransky, 2013-11-05 17:42:05

map, juntamente com select e each é um dos cavalos de trabalho da Ruby no meu código.

Permite-lhe executar uma operação em cada um dos objectos da sua matriz e devolvê-los todos no mesmo lugar. Um exemplo seria aumentar um conjunto de números por um:
[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:

  1. 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]
    
  2. 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
 58
Author: boulder_ruby, 2016-10-24 02:38:59

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.

 4
Author: Pedro Nascimento, 2014-07-23 19:15:04

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}
 4
Author: tokhi, 2016-12-08 16:52:47

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.

 3
Author: Ry-, 2012-08-23 03:56:02

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.

 1
Author: gkstr1, 2016-09-16 21:46:50