Answers:
该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
map
,就好像是map!
map
以及select
和each
是我代码中Ruby的主要工作之一。
它允许您对每个数组对象运行操作,并将它们全部返回到同一位置。一个示例是将数字数组加1:
[1,2,3].map {|x| x + 1 }
#=> [2,3,4]
如果您可以对数组的元素运行单个方法,则可以采用简写形式,例如:
要在上面的示例中执行此操作,您必须执行以下操作
class Numeric
def plusone
self + 1
end
end
[1,2,3].map(&:plusone)
#=> [2,3,4]
为了更简单地使用&快捷方式,我们使用另一个示例:
["vanessa", "david", "thomas"].map(&:upcase)
#=> ["VANESSA", "DAVID", "THOMAS"]
在Ruby中转换数据通常涉及一系列map
操作。研究map
&select
,它们是主库中一些最有用的Ruby方法。它们和一样重要each
。
(map
也是的别名collect
。请在概念上使用最适合您的方法。)
更多有用的信息:
如果您正在运行或运行的Enumerable对象包含一组Enumerable元素(哈希,数组),则可以在块管道中声明每个这些元素,如下所示:each
map
[["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
对于哈希(也是一个Enumerable
对象),哈希只是一个元组数组,其中包含用于解释程序的特殊指令。第一个“管道参数”是关键,第二个是值。
{: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
NoMethodError: private method 'plusone' called for 1:Fixnum
Ruby 2,在Ruby 1.9 / 1.8中获得“错误的args数量”。无论如何,我使用了lambda:plusone = ->(x) { x + 1 }
然后取出了符号说明符:[1,2,3].map(&plusone)
。
private
在放置方法之前在类中声明的那样
0..param_count
表示“不超过param_count”。
0...param_count
表示“最多,但不包括param_count”。
Range#map
不返回Enumerable
,而是将其实际映射到数组。与相同Range#to_a
。
它将功能“映射”到Enumerable
一个范围内的每个项目(在本例中为范围)。因此,它将调用从0到的每个整数传递一次的块param_count
(不包括-您对点是正确的),并返回包含每个返回值的数组。
这是的文档Enumerable#map
。它还有一个别名collect
。
Range#map
实际上将其转换为数组。
Enumerable
像每个一样返回。我以为是。
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提供了由块参数返回的遍历数组的值。
#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()}
map
是在Enumerable对象上发现的常见“功能”方法,用于转换序列中的值(有特殊考虑)。..
和...
创建范围的方法。另外,熟悉 REPL,您可以在这里自己尝试一下!:)