看板 Ruby 關於我們 聯絡資訊
之前有提過外部的 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
godfat:這篇講得很好,我就不多費唇舌了...http://pragdave.blogs. 04/07 22:31
godfat:pragprog.com/pragdave/2007/12/pipelines-using.html 04/07 22:31
blman:讚 :) 04/08 17:20