ruby迭代器枚举器
迭代器
一个迭代器是一个方法,这个方法里面有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
最新文章
- MIT 6.828 JOS学习笔记5. Exercise 1.3
- reverse engineering in ax
- PHP历程(封装的增删改查方法)
- HBase in 2013
- Mvc分页:为IQueryable定义一个扩展方法,直接反回PagedList<;T>;结果集
- 数据挖掘 ID3
- table插件
- 使用GitHub+hexo搭建个人独立博客
- SpriteBuilder中的loadAsScene:方法的返回值
- Codeforces Round #498 (Div. 3)--E. Military Problem
- JAVA乐观锁、悲观锁实现
- pyspider 笔记
- Beta冲刺! Day1 - 磨刀
- 使用pygal_maps_world展示世界地图
- Java学习——使用final修饰符
- Laravel policy 的应用
- [Leetcode]下一个更大元素II
- pycharm 调试Django 奇葩问题:Process finished with exit code -1073741819
- WPF 获取计算机字体
- 通过map文件了解堆栈分配(STM32、MDK5)--避免堆栈溢出
热门文章
- Unity3D研究院编辑器之脚本设置ToolBar
- IIS6下PHP环境的资源未找到(404)问题
- Q5: Remove Duplicates from Sorted Array
- Amazon后台模拟登陆
- android layout_weight 使用总结
- 【java】serialVersionUID作用
- [extjs] ExtJS4 treepanel 子节点选中父节点自动选中,选中父节点 子节点自动全部选中
- 转: ExtJS中xtype一览
- 【linux】关机重启命令
- SPOJ #10657. LOGIC (riddle)