迭代器
一个迭代器是一个方法,这个方法里面有yield语句,使用了yield的方法叫做迭代器,迭代器并非一定要迭代,与传递给这个方法的块进行数据传输

yield将数据传给代码快,代码块再把数据传输给yield

each方法就是一个迭代器,里面有yield语句

枚举器
1 一个枚举器是Enumerable::Enumerator的一个对象,Enumerable是一个模块
2 使用枚举器 1.8的时候需要 require 'enumerator',在2.1就不用了
3 可以通过new来实例化一个枚举器,但是通常使用Object类的to_enum或enum_for,返回一个枚举器,这个枚举器只是简单调用目标对象的each方法,这句话意思就是说例如 a.to_enum执行后返回一个枚举器,这个枚举器的each方法会调用a对象的each方法

4 当给to_enum传递一个符号参数和其他参数的时候,或者使用enum_for语义上更好例如
a.enum_for(:bbb,arg1,arg2),这个:bbb是一个迭代器方法来自a对象,enum_for方法返回一个枚举器,这个枚举器有一个each方法,这个each方法调用上面a对象的迭代器方法就是这个:bbb方法,把其余参数arg1,arg2传递给那个迭代器:bbb

例如String类不是Enumerable的,但是String类自身有三个迭代器方法(方法里有yield,这三个是String的方法,不是Enumerable的) each_char each_byte,each_line,我们想使用一个enumerable方法,比如map,

s = "hello"
s.enum_for(:each_char).map {|c| c.succ}

eg:

class Test1
include Enumerable

def hello(a,b)
yield a+b
end
end

a = Test1.new

b =a.enum_for(:hello,1,2)

b.each do |x|
p x
end

或者

a.enum_for(:hello,1,2).select {|x| puts x}

5使用场景,当一个类A ,include Enumerable时候。A的实例对象就具备了Enumerable里的方法,当我们 a = A.new后, a.enum_for(:xxx)就返回了一个枚举器,这个枚举器的each方法调用这个xxx方法,而这个xxx方法就是A类里的一个迭代器方法,这样就可以a对象调用enumerable里的方法,同时传递一个代码快例子如下
class Test1
include Enumerable

def hello(a,b)
yield a+b
end
def each(a,b)
yield a+b
end
end

a = Test1.new

b =a.enum_for(:hello,1,2)
b.select do |x|
p x
end

6 在1.9,2.1中应该也是一样,不需要显示的调用to_enum或者enum_for,当不用代码块调用内建的迭代器(内建迭代器指的是times,upto,downto,step.each及Enumerable的相关方法)的时候,就是指a.enum_for(:each)这句执行但是没有传递代码快,不传递代码快的话就自动返回一个枚举器
a.each 这个就会返回一个枚举器

按照6所说的,上面实例代码 b =a.enum_for(:hello,1,2) 这行就省略了。直接
a.each do |x|
p x
end

前提是A类里必须有一个each的迭代器方法

class Test1
include Enumerable

def each
yield 3
end
end

a = Test1.new

a.select do |x|
p x
end

有些内建类自身实现了 each方法,才可以 按照6所说的那么做,如果我们自定义一个类,没有实现 each方法,不可以省略.enum_for

最新文章

  1. MIT 6.828 JOS学习笔记5. Exercise 1.3
  2. reverse engineering in ax
  3. PHP历程(封装的增删改查方法)
  4. HBase in 2013
  5. Mvc分页:为IQueryable定义一个扩展方法,直接反回PagedList<T>结果集
  6. 数据挖掘 ID3
  7. table插件
  8. 使用GitHub+hexo搭建个人独立博客
  9. SpriteBuilder中的loadAsScene:方法的返回值
  10. Codeforces Round #498 (Div. 3)--E. Military Problem
  11. JAVA乐观锁、悲观锁实现
  12. pyspider 笔记
  13. Beta冲刺! Day1 - 磨刀
  14. 使用pygal_maps_world展示世界地图
  15. Java学习——使用final修饰符
  16. Laravel policy 的应用
  17. [Leetcode]下一个更大元素II
  18. pycharm 调试Django 奇葩问题:Process finished with exit code -1073741819
  19. WPF 获取计算机字体
  20. 通过map文件了解堆栈分配(STM32、MDK5)--避免堆栈溢出

热门文章

  1. Unity3D研究院编辑器之脚本设置ToolBar
  2. IIS6下PHP环境的资源未找到(404)问题
  3. Q5: Remove Duplicates from Sorted Array
  4. Amazon后台模拟登陆
  5. android layout_weight 使用总结
  6. 【java】serialVersionUID作用
  7. [extjs] ExtJS4 treepanel 子节点选中父节点自动选中,选中父节点 子节点自动全部选中
  8. 转: ExtJS中xtype一览
  9. 【linux】关机重启命令
  10. SPOJ #10657. LOGIC (riddle)