264

我是编程新手。有人可以解释一下.map会做什么:

params = (0...param_count).map
4

8 回答 8

448

map方法接受一个可枚举对象和一个块,并为每个元素运行块,从块中输出每个返回值(原始对象不变,除非您使用map!)

[1, 2, 3].map { |n| n * n } #=> [1, 4, 9]

Array并且Range是可枚举的类型。map带有一个块返回一个数组。 map!改变原始数组。

map!这在哪里有帮助,和有什么区别each?这是一个例子:

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

输出:

Danil is a programmer
Edmund is a programmer
于 2012-08-23T04:01:29.317 回答
69

map,selecteach是我代码中 Ruby 的主力之一。

它允许您对数组的每个对象运行操作并将它们全部返回到同一个位置。一个例子是将一个数字数组加一:

[1,2,3].map {|x| x + 1 }
#=> [2,3,4]

如果你可以在你的数组元素上运行一个方法,你可以用简写风格来做,如下所示:

  1. 要使用上面的示例执行此操作,您必须执行以下操作

    class Numeric
      def plusone
        self + 1
      end
    end
    [1,2,3].map(&:plusone)
    #=> [2,3,4]
    
  2. 为了更简单地使用 & 号快捷方式,让我们使用一个不同的示例:

    ["vanessa", "david", "thomas"].map(&:upcase)
    #=> ["VANESSA", "DAVID", "THOMAS"]
    

在 Ruby 中转换数据通常涉及级联map操作。学习map& select,它们是主库中一些最有用的 Ruby 方法。它们与each.

map也是 的别名collect。在概念上使用最适合您的东西。)

更多有用信息:

如果您正在运行或正在运行的Enumerable对象包含一组 Enumerable 元素(哈希、数组),您可以在块管道中声明每个元素,如下所示:eachmap

[["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

对于 Hash(也是一个Enumerable对象,Hash 只是一个带有解释器特殊指令的元组数组)。第一个“管道参数”是键,第二个是值。

{:make => "audi", :color => "black", :year => 2008}.each do |k,v|
    puts "#{k} is #{v}"
end
#make is audi
#color is black
#year is 2008

要回答实际问题:

假设这params是一个哈希,这将是映射它的最佳方式:使用两个块参数而不是一个来捕获哈希中每个解释元组的键值对。

params = {"one" => 1, "two" => 2, "three" => 3}
params.each do |k,v|
  puts "#{k}=#{v}"
end
# one=1
# two=2
# three=3
于 2013-10-11T16:56:05.627 回答
8

对于任何需要可视化它的人:

Map方法示例直观说明

什么都不做的地图

做得更少的地图

地图爆炸!

这是完整的故事:

https://richstone.io/rubys-map-collect-methods-explained-visually/

于 2021-03-30T10:46:02.580 回答
6

使用 ruby​​ 2.4,您可以使用transform_values从 rails 提取到 ruby​​ 的此功能来做同样的事情。

h = {a: 1, b: 2, c: 3}

h.transform_values { |v| v * 10 }
 #=> {a: 10, b: 20, c: 30}
于 2016-12-08T16:52:47.160 回答
4

0..param_count表示“最多并包括 param_count”。 0...param_count表示“最多,但不包括 param_count”。

Range#map不返回一个Enumerable,它实际上将它映射到一个数组。它与 相同Range#to_a

于 2012-08-23T03:57:04.333 回答
3

它将一个函数“映射”到一个Enumerable- 在这种情况下,一个范围内的每个项目。因此,它会调用从 0 到param_count(不包括 - 你对点是正确的)的每个整数传递一次的块,并返回一个包含每个返回值的数组。

这是Enumerable#map. 它还有一个别名,collect.

于 2012-08-23T03:56:02.173 回答
2

#each

#each为数组中的每个元素运行一个函数。以下两个代码摘录是等效的:

x = 10
["zero", "one", "two"].each{|element|
    x++
    puts element
}
x = 10
array = ["zero", "one", "two"]

for i in 0..2
    x++
    puts array[i]
end

#map

#map对数组的每个元素应用一个函数,返回结果数组。以下是等价的:

array = ["zero", "one", "two"]
newArray = array.map{|element| element.capitalize()}
array = ["zero", "one", "two"]

newArray = []
array.each{|element|
    newArray << element.capitalize()
}

#map!

#map!就像#map,但修改了数组。以下是等价的:

array = ["zero", "one", "two"]
array.map!{|element| element.capitalize()}
array = ["zero", "one", "two"]
array = array.map{|element| element.capitalize()}
于 2020-03-09T22:42:13.473 回答
2

Map 是可枚举模块的一部分。非常类似于“收集”例如:

  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}

Map 提供遍历由块参数返回的数组的值。

于 2016-09-16T21:46:50.643 回答