地图是什么!做红宝石

时间:2014-07-23 18:05:59

标签: ruby

我对ruby很新,我对map!语法的作用感到有点困惑。我在代码库上看到以下行

b.map(&:values).uniq!.map!

b.map(&:values).uniq!给出了以下输出:

[["us"],
 ["au"],
 ["fr"],
 ["mx"],
 ["ad",
  "ae",
  "af",
  "al",
  "am",
  "ao",
  "aq"]]

当我在.map!的末尾添加b.map(&:values).uniq!时,我得到#<Enumerator: ...>。我不确定发生了什么。如果有人能向我解释发生了什么,那将是非常有帮助的。

1 个答案:

答案 0 :(得分:1)

来自documentation

  

self的每个元素调用给定的块一次,用块返回的值替换该元素。

     

另见Enumerable#collect

     

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

这意味着如果您使用了map!一个块 - 该数组将使用该块的返回值替换其所有元素:

b.map(&:values).uniq!.map!(&:first)
# => ["us", "au", "fr", "mx", "ad"]

由于你没有添加一个块,你得到一个Enumerator,就像一个延迟的动作光标,你可以在以后添加你的块:

enum = b.map(&:values).uniq!.map!
enum.each(&:first)
# => ["us", "au", "fr", "mx", "ad"]