【问题标题】:Iterating over an array and building a new array with incremented values [duplicate]迭代一个数组并构建一个具有递增值的新数组[重复]
【发布时间】:2018-12-20 16:40:24
【问题描述】:

这段代码有什么区别:

p arr = [1, 2, 3, 4, 5]
p arr.map! { |a| a + 2 }

还有这段代码?

arr = [1, 2, 3, 4, 5]
new_arr = []

arr.each do |n|
  new_arr << n + 2
end

p arr
p new_arr

它们都得出相同的答案。它们只是实现相同解决方案的两种不同方式,还是存在流程或应用差异?

【问题讨论】:

  • 第一种方法在原地修改arr,而第二种方法创建新数组-因此第二种方法需要内存分配,因此会更慢。除此之外你没有太大区别

标签: ruby


【解决方案1】:

#map 函数“为 self 的每个元素调用一次给定块,将元素替换为块返回的值”。

在您的第二个示例中,#each 方法通过添加 + 2 来修改数组的每个元素并返回修改后的数组。第二个示例基于创建一个新数组并用第一个数组中的修改值填充它。

过程几乎相同,主要区别在于,在第一个示例中,您永久修改数组,而在第二个示例中,您可以保持第一个数组不变并使用修改后的值创建一个新数组。

【讨论】:

  • 啊,我想我明白了。 #map 函数是破坏性的,而#each 将创建一个新数组并保留原始数组?
  • map! 函数将永久更改数组,因此您可以将其称为破坏性。您可以使用map(不带感叹号)仅收集 map 函数的结果而不更改数组。您的第二个示例(在某种程度上)等同于 new_arr = arr.map {|x| x + 2},因为您将同时拥有原始的 arrnew_arr
猜你喜欢
  • 1970-01-01
  • 2019-03-24
  • 1970-01-01
  • 1970-01-01
  • 2012-11-06
  • 1970-01-01
  • 1970-01-01
  • 2014-10-16
  • 2019-12-22
相关资源
最近更新 更多