[Ruby] Fiber 取代 Generator
之前有提過外部的 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
→
04/07 22:31, , 1F
04/07 22:31, 1F
→
04/07 22:31, , 2F
04/07 22:31, 2F
推
04/08 17:20, , 3F
04/08 17:20, 3F
Ruby 近期熱門文章
PTT數位生活區 即時熱門文章