Ruby中的“map”方法是做什么的?

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

 params = (0...param_count).map 

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

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

ArrayRange是可枚举的types。 用块返回一个数组。 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 

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操作。 学习mapselect ,它们是主库中最有用的Ruby方法。 他们和each一样重要。

map也是collect的别名,从概念上使用最适合你的东西。)

更有帮助的信息:

如果您正在运行的Enumerable对象包含一组Enumerable元素(散列,数组),则可以像这样在块pipe道中声明每个元素:

 [["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只是一个具有特殊指令的解释器的元组数组)。 第一个“pipe道参数”是关键,第二个是数值。

 {: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 

0..param_count意思是“直到并包括param_count”。 0...param_count意思是“最多,但不包括param_count”。

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

它将函数“映射”到Enumerable每个项目 – 在本例中是一个范围。 所以它会调用从0到param_count (独占 – 你是对的点)的每个整数一次传递的块,并返回一个包含每个返回值的数组。

这是Enumerable#map的文档。 它也有一个别名, collect

我会尝试一种不同的方法来解释上面的内容:

地图做什么

我曾经在当天照相复制的地方工作。 我们会得到一堆文件。 基本上我们不得不:

  1. 复印每一页和
  2. 拿着新的页面,我们不得不在每个页面上盖上“清除”字样。

换句话说,我们得到了一些我们不得不转化成新的东西的页面。 在这种情况下,最终的结果是复印一张新的邮票。

我可以很容易地:(i)删除第一行,或(ii)完全摧毁新的复印件。

这基本上就是地图function的作用:它允许你将一系列的项目转换成你喜欢的任何东西!

 basket = [apple, orange, banana] new_basket_full_of_eaten_food = basket.map { |food_item| food_item.take_a_huge_bite } 

在上面的例子中,我们把一篮子食物变成了一大堆新鲜水果, 这就是它的改变!

重要

就像下面的@Anthony注意到的那样,原来的一篮子水果仍然没有被打开:它仍然在那里,而且没有咬住它们。

您可以在这里的ruby文档确认: https : //ruby-doc.org/core-2.2.0/Array.html#method-i-map

我希望这可以帮助你。

使用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} 

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提供了通过块参数返回的数组迭代的值。