[Ruby] Fiber 取代 Generator

看板Ruby作者 (godfat 真常)時間17年前 (2008/04/07 17:29), 編輯推噓1(102)
留言3則, 2人參與, 最新討論串1/1
之前有提過外部的 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
這篇講得很好,我就不多費唇舌了...http://pragdave.blogs.
04/07 22:31, 1F

04/07 22:31, , 2F
pragprog.com/pragdave/2007/12/pipelines-using.html
04/07 22:31, 2F

04/08 17:20, , 3F
讚 :)
04/08 17:20, 3F
文章代碼(AID): #17-UbdkV (Ruby)
文章代碼(AID): #17-UbdkV (Ruby)