【问题标题】:How are array.each and array.map different? [duplicate]array.each 和 array.map 有何不同? [复制]
【发布时间】:2011-08-07 01:04:43
【问题描述】:

可能重复:
Array#each vs. Array#map

ruby-1.9.2-p180 :006 > ary = ["a", "b"]
 => ["a", "b"] 
ruby-1.9.2-p180 :007 > ary.map { |val| p val }
"a"
"b"
 => ["a", "b"] 
ruby-1.9.2-p180 :008 > ary.each { |val| p val }
"a"
"b"
 => ["a", "b"] 

ruby-1.9.2-p180 :009 > ary.map { |val| val << "2" }
 => ["a2", "b2"] 
ruby-1.9.2-p180 :010 > ary.each { |val| val << "2" }
 => ["a22", "b22"] 

【问题讨论】:

    标签: ruby iterator


    【解决方案1】:

    side effects 相同,这给您的逆向工程增加了一些混乱。

    是的,两者都遍历数组(实际上是 mixes in Enumerable 的任何内容),但 map 将返回一个由块结果组成的数组,而 each 将只返回原始数组。 each 的返回值在 Ruby 代码中很少使用,但 mapmost important functional tools 之一。

    顺便说一句,您可能很难找到文档,因为 mapEnumerable 中的一种方法,而 each (需要的一种方法Enumerable 模块)是 Array 中的一个方法。

    作为一个琐事说明:map 实现基于 each

    【讨论】:

    • +1 用于将“地图”链接到函数式编程。另一方面,“每个”是具有副作用的常用命令式循环。
    • 地图似乎不是很“实用”,因为更改相关对象会更改原始对象
    • @j 会,嗯,map! 更改原始对象,但普通的 map 会创建一个新数组作为结果。
    • Array 确实包含Enumerable,但它提供了自己的(优化的)map。而Array#map不是基于each
    【解决方案2】:

    Array#map 是每个元素在阻塞中返回的任何内容的集合。

    Array#each 为每个元素执行代码块,然后返回列表本身。

    你应该检查这个Array#each vs. Array#map

    【讨论】:

      【解决方案3】:

      Each 只是一个迭代器,它获取可迭代对象的下一个元素并提供给块。 Map 用于迭代但将元素映射到其他东西,例如乘以常数的值。在您的示例中,它们可以互换使用,但每个都是将元素传递给块的更通用的迭代器。

      【讨论】:

        【解决方案4】:

        API 文档中的定义: each:为 self 中的每个元素调用一次 block,将该元素作为参数传递。 map:为self的每个元素调用一次block。创建一个包含块返回值的新数组。

        所以每个都是一个正常的循环,它遍历每个元素并调用给定的块

        map 通常用于您希望通过某种逻辑将另一个数组映射到现有数组的地方。您还可以将方法作为参考传递给映射函数,如

        [1,2,3].map(&:to_s)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-19
          • 2019-09-17
          • 2021-08-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多