Ruby Enumerable#each (with no block given) 和 Enumerable#map (with no block given) 有什么区别

lululau · 2015年06月12日 · 最后由 lululau 回复于 2015年06月12日 · 1788 次阅读

Enumerable 定义的很多方法,在调用时,如果没有传递一个 block,那么这些方法都会返回一个 Enumerator 实例,比如:

  • each
  • map
  • select
  • each_slice
  • each_with_index

等等……

其中的 eachmapselect 等方法所返回的 Enumerator 在对其进行迭代时,都是原封不动得依次返回原 Enumerable 对象的各元素。那么问题就是,这三个方法所返回的 Enumerator 对象有什么区别?如果没区别的话,像 mapselect 等会返回 Enumerator 这样的设计是出于什么原因或目的?

自己搜到答案了:

[238] pry(main)> x = [1, 2, 3, 4]
=> [1, 2, 3, 4]
[239] pry(main)> ea = x.each
=> #<Enumerator: ...>
[240] pry(main)> ea.each { |e| e }
=> [1, 2, 3, 4]
[241] pry(main)> eb = x.map
=> #<Enumerator: ...>
[242] pry(main)> eb.each { |e| e * 2}
=> [2, 4, 6, 8]
[243] pry(main)> ec = x.select
=> #<Enumerator: ...>
[244] pry(main)> ec.each { |e| e == 2}
=> [2]
[245] pry(main)> eb.each { |e| e == 2}
=> [false, true, false, false]

http://blog.carbonfive.com/2012/10/02/enumerator-rubys-versatile-iterator/

需要 登录 后方可回复, 如果你还没有账号请 注册新账号