2014-07-23 60 views
-3

我是相当新的红宝石,我有点困惑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

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"] 
+0

那么什么是枚举器? – user3746602

+0

看看这个SO回答:http://stackoverflow.com/questions/16973624/what-is-the-purpose-of-the-enumerator-class-in-ruby – orde