Ruby 关于 ruby 的内部和外部的迭代器

ane · 2013年12月17日 · 最后由 iBachue 回复于 2013年12月17日 · 2663 次阅读

看完 M 的 ruby 编程语言的迭代器部分,老实说,的确每一行代码都看明白了。但是总是说不出个所以然,感觉还

是理解不深刻,是否还有网络上的资源可以供小生追读一下,中文英文都 ok(繁体中文头大),请留下您的链接,

thanks。

比较理解难的有这么一段代码

def bundle(*enumerables)
   enumerators = enumerables.map { |e| e.to_enum } //第2行
   loop { yield enumerators.map { |e| e.next} }//第3行
end
a,b,c = [1,2,3], 4..6, 'a'..'e'
bundle(a,b,c) { |x| print x}

调试中我发现第 2 行的 enumerators 是 [#, #, #], 所以第 3 行的执行过程应该是: 第一次循环 loop,取出 c 的每一个 Enumerator 元素的 next(我就表示成 Enumerator[0]),赋给 block,也就是打印出 1,4,'a'。(隐式的操作 map(next)=&block 的结果) 第二次循环 loop,取出 enumerators 的每一个 Enumerator 元素的 next(我就表示成 Enumerator[1]), 赋给 block,也就是 打印出 2,5,'b'。(隐式的操作 map(next)=&block 的结果) 第三次循环 loop,取出 enumerators 的每一个 Enumerator 元素的 next(我就表示成 Enumerator[2]), 赋给 block,也就是 打印出 3,6,'c'。 第四次循环 loop,发现第一个 enumerators[0].next 已经没有元素了,所以跳出 loop,也就忽视 enumerators[2]。(隐式的操作 map(next)=&block 的结果)

纯属个人 yy 的过程,请指正。 另外有好的关于迭代器方面的文章,感谢分享。。

你为什么不贴代码?

#1 楼 @lgn21st 哈哈,我是想看看有不有一些人写的体会的文章

#2 楼 @u1378130755 问题是你的描述没有上下文,其他人是看不懂的呀。

#3 楼 @lgn21st 已经更新了,上了一段昨晚看的代码,确实还是没有很看懂。

#3 楼 @lgn21st 啊哈,我想通了,我还是再更新一下吧。

loop 循环里 catch enumerator.next 没有元素的异常 然后直接跳出,这绝对是个坑啊

#4 楼 @u1378130755 其实我觉得这代码挺好懂的。。

#6 楼 @iBachue enumerator.next 没有元素会爆出异常吗?

#8 楼 @u1378130755 会的

1.9.3p448 :001 > e = [1.2,3].each
 => #<Enumerator: [1.2, 3]:each>
1.9.3p448 :002 > e.next
 => 1.2
1.9.3p448 :003 > e.next
 => 3
1.9.3p448 :004 > e.next
StopIteration: iteration reached an end
    from (irb):4:in `next'
    from (irb):4
    from /Users/zhour6/.rvm/rubies/ruby-1.9.3-p448/bin/irb:16:in `<main>'

#9 楼 @iBachue 会不会是 loop 起到了监测的作用?

#10 楼 @u1378130755 其实就是让你少写点代码呗 否则每次执行next前还要判断,多麻烦啊

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