big*_*ato 243 ruby enumeration map range
我是编程新手.有人可以解释一下.map
会做什么:
params = (0...param_count).map
Run Code Online (Sandbox Code Playgroud)
Dan*_*sky 423
该map
方法采用可枚举对象和块,并为每个元素运行块,从块输出每个返回值(原始对象不变,除非您使用map!)
:
[1, 2, 3].map { |n| n * n } #=> [1, 4, 9]
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
输出:
Danil is a programmer
Edmund is a programmer
Run Code Online (Sandbox Code Playgroud)
bou*_*uby 65
map
,select
和each
我的代码中的Ruby是其中一个主力.
它允许您对每个数组的对象运行操作,并将它们全部返回到同一位置.一个例子是将数字数组增加一:
[1,2,3].map {|x| x + 1 }
#=> [2,3,4]
Run Code Online (Sandbox Code Playgroud)
如果你可以在数组的元素上运行单个方法,你可以像这样的速记样式:
要使用上面的示例执行此操作,您必须执行以下操作
class Numeric
def plusone
self + 1
end
end
[1,2,3].map(&:plusone)
#=> [2,3,4]
Run Code Online (Sandbox Code Playgroud)为了更简单地使用&符号快捷方式技巧,让我们使用另一个例子:
["vanessa", "david", "thomas"].map(&:upcase)
#=> ["VANESSA", "DAVID", "THOMAS"]
Run Code Online (Sandbox Code Playgroud)在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
Run Code Online (Sandbox Code Playgroud)
对于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
Run Code Online (Sandbox Code Playgroud)
回答实际问题:
假设这params
是一个散列,这将是映射它的最佳方式:使用两个块参数而不是一个来捕获散列中每个解释元组的键和值对.
params = {"one" => 1, "two" => 2, "three" => 3}
params.each do |k,v|
puts "#{k}=#{v}"
end
# one=1
# two=2
# three=3
Run Code Online (Sandbox Code Playgroud)
Ric*_*etz 13
对于任何需要可视化它的人:
完整的故事如下:
https://richstone.io/rubys-map-collect-methods-explained-visually/
使用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}
Run Code Online (Sandbox Code Playgroud)