Ruby - map vs each?

时间:2017-12-01 11:07:36

标签: ruby

我有这个代码:

def yeller(array)
  a = array.each(&:upcase)
  puts a
  puts array
  return "a: " + a.join
  return "array: " + array.join
end

yeller(%w[a, b, c]) # => "a: a,b,c"
# >> a,
# >> b,
# >> c
# >> a,
# >> b,
# >> c

def yeller(array)
  a = array.map(&:upcase)
  puts a
  puts array
  return "a: " + a.join
  return "array: " + array.join
end

yeller(%w[a, b, c]) # => "a: A,B,C"
# >> A,
# >> B,
# >> C
# >> a,
# >> b,
# >> c

令人困惑的是,array消失了。它在哪里? eachmap之间有什么区别?

请更熟悉Ruby的人来纠正我:我理解map迭代数组并返回一个数组,而each只迭代。

1 个答案:

答案 0 :(得分:2)

该文件建议:

  

每个{|项目|阻止}→ary单击以切换源   每个→普查员   为self中的每个元素调用给定的块一次,将该元素作为参数传递。

  

map {| item |阻止}→new_ary单击以切换源地图→枚举器   为self的每个元素调用给定的块一次。

     

创建一个包含块返回值的新数组。

     

另见Enumerable#collect。

     

如果没有给出阻止,则返回枚举器。

实际上意味着 map会创建另一个新数组,而each只会迭代并且不会触及原始数组。

一个例子:

def yeller(array)
 a = array.each(&:upcase)
 puts a
 puts array
 puts "a: " + a.join
 puts "array: " + array.join
 puts "a == array?" + (a==array).to_s
end

yeller(%w[a, b, c])

def yeller(array)
  a = array.map(&:upcase)
  puts a
  puts array
  puts "a: " + a.join
  puts "array: " + array.join
end

yeller(%w[a, b, c])

结果:

a,
b,
c
a,
b,
c
a: a,b,c
array: a,b,c
a == array?true
A,
B,
C
a,
b,
c
a: A,B,C
array: a,b,c