作者godfat (godfat 真常)
看板Ruby
标题[Ruby] Fiber 取代 Generator
时间Mon Apr 7 17:29:08 2008
之前有提过外部的 iterator 可以由 Generator 产生,
不过这东西用到 Continuation, 一来效率低落,二来容易有问题?
现在在 Ruby 1.9 里有个 Fiber 可以拿来取代他:
require 'fiber'
a = (0..9).to_a
f = Fiber.new{ a.each{|i| Fiber.yield i}; nil }
while i = f.resume; puts i; end # 这边写成这种 while 是为了省掉宣告 i
Fiber 概念很简单,就是产生出来的 fiber 一开始不会执行,
呼叫 resume 则开始执行。遇到 Fiber.yield 则中断执行,并把 arguments 传回给
呼叫 resume 的地方。这里就是把 a 的 member 丢回去。所以 resume 会接到各个
array 的 member.
最後把 nil 传回去当作结束符号。如果再呼叫一次 resume 的话,就会吃:
FiberError: dead fiber called
此外,Fiber.new{ |a,b,c| [a,b,c] }.resume 1,2,3 会回传 [1,2,3],
也就是说,resume 可以吃任意长度的 arguments, 只要一开始给定的 block 有吃。
靠这特性也可以玩一些比较诡异的东西,不过下次再举例... ._.
--
By Gamers, For Gamers - from the past Interplay
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.128.121.85
2F:→ godfat:pragprog.com/pragdave/2007/12/pipelines-using.html 04/07 22:31
3F:推 blman:赞 :) 04/08 17:20