博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ruby迭代器枚举器
阅读量:4664 次
发布时间:2019-06-09

本文共 1757 字,大约阅读时间需要 5 分钟。

迭代器

一个迭代器是一个方法,这个方法里面有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

 

转载于:https://www.cnblogs.com/or2-/p/5482822.html

你可能感兴趣的文章
ahjesus Axure RP 7.0注册码
查看>>
3.3 建立松耦合组件(MVC 模式最重要的特性之一是它支持、关注“分离”)《精通 ASP.NET MVC 5》 推荐指数:8 星半...
查看>>
c# 的MD5加密算法
查看>>
Java反射机制
查看>>
Servlet笔记
查看>>
纯css3代码写无缝滚动效果
查看>>
KMP解决最小循环节问题
查看>>
android Fragments详解二:创建Fragment
查看>>
需求分析文档(3月22日)
查看>>
【剑指offer】丑数
查看>>
JAVA-JSP注释
查看>>
latch: shared pool等待事件
查看>>
根据繁忙程度来选择快照的id
查看>>
服务器MySql搭建
查看>>
checkbox控制text是否可以填写和radio是否可选
查看>>
P3811 【模板】乘法逆元
查看>>
ORACLE 行迁移和行链接
查看>>
MSSQL跨服務器複製數據
查看>>
Javascript(js) dateDiff 日期减法函数
查看>>
第四百七十四天 how can I 坚持
查看>>