.map
在以下代码中是什么意思:
params = (0...param_count).map
.map
在以下代码中是什么意思:
params = (0...param_count).map
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!
的做法是有风险的。请问您需要我翻译什么内容呢? - kaleidicmap
,连同select
和each
是Ruby代码中的重要组成部分。
它允许您在数组的每个对象上运行操作并将它们全部返回到同一位置。例如,可以将数字数组逐个增加一个:
"[1,2,3].map {|x| x + 1 }
#=> [2,3,4]
To do this with the above example you'd have to do something like this
class Numeric
def plusone
self + 1
end
end
[1,2,3].map(&:plusone)
#=> [2,3,4]
To more simply use the ampersand shortcut technique, let's use a different example:
["vanessa", "david", "thomas"].map(&:upcase)
#=> ["VANESSA", "DAVID", "THOMAS"]
在 Ruby 中转换数据通常涉及一系列 map
操作。学习 map
和 select
,它们是主要库中最有用的 Ruby 方法之一。它们和 each
一样重要。
(map
也是 collect
的别名。使用哪个更符合你的概念就用哪个。)
更有帮助的信息:
如果你在运行 each
或 map
的 Enumerable 对象中包含一组 Enumerable 元素(哈希、数组),你可以在块管道中声明这些元素,如下所示:
[["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 1.9/1.8中则是“参数数量错误”。无论如何,我使用了一个lambda:plusone = ->(x) { x + 1 }
,然后去掉了符号说明符:[1,2,3].map(&plusone)
。 - tjmcewan使用 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}
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
实际上会将其转换为数组。 - Pedro Nascimentomap
本身并不像 each
一样返回一个 Enumerable
。我原以为它会这样。 - Pedro Nascimento#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是可枚举模块的一部分,与“collect”非常相似。例如:
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提供了通过数组迭代返回由块参数返回的值。
map
是在可枚举对象上常见的函数式方法,用于转换序列中的值(需考虑特殊情况)。..
和...
可以用来创建范围。此外,请熟悉REPL,您可以在其中自行尝试这些内容! :) - user166390