javascript语言扩展:可迭代对象(5)
文章1-4篇说的都是js中的可迭代对象,下面让我们看看ruby中的等价物。
不可否认,ruby中对于迭代器和生成器的语法都相当简洁;ruby从一开始就有一个简洁的基因,而js后来的不断扩充使得其有些语法比较“别扭”和“奇怪”,虽说ruby也不比js小几岁啊!(官方的说法是一个1992年一个1995年)
在ruby中遍历一个数组的代码如下所示:
ary = (1..10).to_a
ary.each {|x| puts x}
#你也可以直接写
(1..10).to_a.each {|x|puts x}
而在ruby中范围对象本身是可枚举的(可遍历差不多意思),所以你可以直接这么写:
(1..10).each {|x|puts x}
在ruby中写一个迭代器,也是相当简单:
def itor(x)
10.times {|i|yield x*i}
end
#调用迭代器后面直接跟代码块
itor(11) {|x|puts x}
#返回
=begin
0
11
22
33
44
55
66
77
88
99
=end
而ruby中的枚举器和js中的可迭代对象类似,枚举器是类Enumerable::Enumerator的实例,一般通过Object类的to_enum或其同义词enum_for方法来创建连如果调用时没有提供参数则to_enum返回一个枚举器,该枚举器的each方法只是简单调用目标对象的each方法,枚举器的一个用途是建立防御式拷贝:
(1..10).to_enum.each {|x|puts x}
如果to_enum中第一个实参是一个符号,则它标识了一个迭代器方法,枚举器的each方法调用那个迭代器方法:
s.to_enum(:each_byte).each {|x|puts x}
=begin
返回
104
101
108
108
111
32
119
111
114
108
100
=end
2.1.5 :016 > s.to_enum(:each_char).each {|x|puts x}
=begin
返回
h
e
l
l
o
w
o
r
l
d
=end
而在ruby1.9之后又对枚举器的语法做了修改使其更加简洁,当以不带代码块的方式调用内建迭代器方法时,会自动返回一个枚举器,因此上述代码可以简写为:
s.each_char.each {|x|puts x}
要想对自定义的迭代器方法实现如上行为,可以通过返回self.to_enum来实现:
def itor(x)
if block_given?
10.times {|i|yield x*i}
else
self.to_enum(:itor,x)
end
end
#我们可以这样调用
itor(11) {|x|puts x}
#也可以这样调用
itor(11).each {|x| puts x}
简单解释下self.to_enum(:itor,x)这句,因为我为了测试方便是在全局上下文中定义的函数itor,所以它自动成为全局对象main的私有方法,而该方法也会成为Object类的私有实例方法:
def ps
puts "hi"
end
class A
def sh
ps
end
end
a = A.new
a.sh #显示"hi:
在执行self.to_enum(:itor,x)时,当时的self是main对象,即将返回枚举器的each方法与itor函数对应上。
ruby里面也有类似的for in循环,不过我们一般都不怎么用呢:
for x in itor(11)
puts x
end
#和itor(11).each {|x|puts x}代码返回一样
枚举器可以实现外部迭代,实际上枚举器也称为外部迭代器。可以使用Kernel.loop方法包裹枚举器,从而在StopIteration异常抛出时自动退出循环:
itor = 9.downto(1)
loop {print "#{itor.next}, "}
#打印8, 7, 6, 5, 4, 3, 2, 1,
在ruby中枚举器自带了rewind方法使外部迭代器重新开始迭代。
最后,在ruby中我们可以用纤程(Fiber)来实现所谓的生成器,虽然这比较晦涩:
def fibonacci_generator
Fiber.new do
x,y = 0,1
loop do
Fiber.yield y
x,y = y,x+y
end
end
end
g = fibonacci_generator
10.times {print g.resume, " "}
javascript语言扩展:可迭代对象(5)的更多相关文章
- javascript语言扩展:可迭代对象(3)
除了前2篇文章中描述的可迭代对象以外,在js语言扩展中的生成器对象,也可以作为可迭代对象. 这里用到一个新的关键字yield,该关键字在函数内部使用,用法和return类似,返回函数中的一个值:yie ...
- javascript语言扩展:可迭代对象(1)
在ECMAScript中我们知道可以通过for in语句进行对象属性的遍历,当然这些属性不包括继承而来的属性: var ary = [1,2,3,"aa",4]; for(i in ...
- javascript语言扩展:可迭代对象(2)
在文章迭代器(1)中我们简单介绍了如何创建一个可迭代对象:出于某种考虑你可能想从可迭代对象中显式获取一个迭代器对象,这时你可以调用Iterator()函数(该函数是定义在JavaScript 1.7中 ...
- javascript语言扩展:可迭代对象(4)
js 1.7中还包含一个数组推导(array comprehension)的特性,如果不在最后介绍它好像显得不怎么完整. 数组推导其实很简单: let a = [x*x for(x in range( ...
- Python Cookbook(第3版)中文版:15.20 处理C语言中的可迭代对象
15.20 处理C语言中的可迭代对象¶ 问题¶ 你想写C扩展代码处理来自任何可迭代对象如列表.元组.文件或生成器中的元素. 解决方案¶ 下面是一个C扩展函数例子,演示了怎样处理可迭代对象中的元素: s ...
- python 迭代器(一):迭代器基础(一) 语言内部使用 iter(...) 内置函数处理可迭代对象的方式
简介 在 Python 中,所有集合都可以迭代.在 Python 语言内部,迭代器用于支持: 1.for 循环2.构建和扩展集合类型3.逐行遍历文本文件4.列表推导.字典推导和集合推导5.元组拆包6. ...
- 扩展javascript扩展(类,对象,原型)
扩展javascript扩展(类,对象,原型)
- JavaScript中对象与函数的某些事[JavaScript语言精粹-N1]
今天在读<JavaScript语言精粹>的时候,关于函数的一个部分,始终觉得有点难以理解,代码如下: 1: var obj = (function(){ 2: var value = 0; ...
- JavaScript语言精粹之对象
用object.hasOwnProperty(variable)来确定这个属性名是否为该对象成员,还是来自于原型链. for(my in obj){ if(obj.hasOwnProperty(my) ...
随机推荐
- Description Resource Path Location Type AndroidManifest.xml file missing!
这个问题又找了好久.国内回答的确不敢恭维. 本回答来自谷歌: This is build issue. Go to Menu in eclipse, Project>clean then P ...
- 【Unity Shaders】法线纹理(Normal Mapping)的实现细节
写在前面 写这篇的目的是为了总结我长期以来的混乱.虽然题目是"法线纹理的实现细节",但其实我想讲的是如何在shader中编程正确使用法线进行光照计算.这里面最让人头大的就是各种矩阵 ...
- I/O操作之概述与导读
I/O流可以表示很多不同种类的输入源和输出目的地,包括简单的字节流,基本数据(int.boolean.double等),本地化的字符,以及对象.一些流只是简单地传递数据,还有一些流可以操作和转换数据 ...
- 套接字输入缓冲装置——InternalInputBuffer
互联网的世界很复杂,信息从一端传向另一端过程也相当复杂,中间可能通过若干个硬件,为了提高发送和接收效率,在发送端及接收端都将引入缓冲区,所以两端的套接字都拥有各自的缓冲区,当然这种缓冲区的引入也带来了 ...
- android分包方案
当一个app的功能越来越复杂,代码量越来越多,也许有一天便会突然遇到下列现象: 1. 生成的apk在2.3以前的机器无法安装,提示INSTALL_FAILED_DEXOPT 2. 方法数量过多,编译时 ...
- (NO.00004)iOS实现打砖块游戏(五):游戏场景类
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 创建游戏场景类头文件 在Xcode创建新GameScene类,继 ...
- UNIX环境高级编程——I/O多路转接(select、pselect和poll)
I/O多路转接:先构造一张有关描述符的列表,然后调用一个函数,直到这些描述符中的一个已准备好进行I/O时,该函数才返回.在返回时,它告诉进程哪些描述符已准备好可以进行I/O. poll.pselect ...
- ROC曲线的AUC(以及其他评价指标的简介)知识整理
相关评价指标在这片文章里有很好介绍 信息检索(IR)的评价指标介绍 - 准确率.召回率.F1.mAP.ROC.AUC:http://blog.csdn.net/marising/article/det ...
- Android ToggleButton 实践
在android的开发过程中,对于ToggleButton的使用频率也是相当的高的,下面我就来说一下,这个组件的两种使用方式. 第一种是简单的使用,利用Toast的方式弹出提示语句 需要注意的是要想自 ...
- Linux Debugging(二): 熟悉AT&T汇编语言
没想到<Linux Debugging:使用反汇编理解C++程序函数调用栈>发表了收到了大家的欢迎.但是有网友留言说不熟悉汇编,因此本书列了汇编的基础语法.这些对于我们平时的调试应该是够用 ...