Ruby 板


LINE

因為我不會用ASCII 所以要看比較清楚,有顏色的解說就看我的 Blog 吧 http://lightyror.blogspot.com/2006/09/ruby-continuation.html 試著想想這個程式(出自 Beyound JAVA 範例) 1 def con_loop 2 for i in 1..5 do 3 puts i 4 callcc { |a| return a } if i == 2 5 puts '#' 6 end 7 return nil 8 end 9 puts 'Before loop call' 10 cont = con_loop() 11 puts 'After loop call' 12 cont.call if cont 13 puts 'After continuation call' 想想這個程式會怎麼做? 這是這個程式的結果,很出人意料之外吧 Before loop call 1 # 2 After loop call # 3 # 4 # 5 # After loop call After continuation call 為什麼 After loop call 執行了兩次? 為什麼 1 2 跟 3 4 5 中間夾了一個 After Call 這就講到一個有趣的物件 Continuation 他是一個物件,裡面記載著程式運作的狀態 好像遊戲打到一半,媽媽叫你去吃飯,你只好心不甘情不願的去存檔 可是吃完飯,load 剛剛存的檔,你的角色的經驗值都還在,寶物都不會不見一樣 Continuation 就是那個遊戲的紀錄檔 現在可以討論這個程式了 i 進入loop裡面 ,puts 1 ,puts 2 當 i = 2 時 下一行也就是第四行,因為 if i == 2 這個敘述的緣故( 媽媽叫你吃飯了) 會被強迫跳出這個 loop ( return a ) (只好關機) 但是, callcc { |a| return a } 他會 return 一個 continuation 物件 continuation 裡面的內容就是你遊戲的紀錄檔 他會在 10行裡面,存到 cont 這個 Object 裡面 (存檔等下再來玩) 所以程式會 puts 1 , 2 之後,就進入第11行的 puts 'After loop call' 這也是第一次的 After loop call 印好 After loop call 第12行,他會檢查 cont 這個物件有沒有值 (檢查存檔在不在) 發現到有值,就執行 Continuation 物件的 call method (呼叫存檔) 他會到 loop function 裡面 ,剛剛 return continuation 物件的地方 最重要的是 他會紀錄 i 這個 tmp variable 是 2,因為他本來就會紀錄程式狀態 然後執行第五行的 puts '#' 這也是為啥,結果裡面第一個 After loop call 後面是 # 再來他會繼續的進行 loop ,從 i =3 ~ 5 最後執行結束,他會在第7行 return null 值,交給 cont 物件 之後他就會執行第二次的 After loop call 這個機制怎麼玩呢? 我們可以想到,程式執行到一半,有個 interrupt 他出去執行一下 error handler ,然後回來繼續處理剛剛的事情 當然我們當然可以用其他方式做到類似的事情,不過這個作法的確提供很方便的方式 根據 Wikipedia 的講法 Lisp ,Ruby ,Smalltalk 都有提供類似的作法(果然 Ruby 是 Perl + SmallTalk + Lisp ) 但是我比較好奇 C 也有這種作法? * C: setcontext et al. (UNIX System V and GNU libc) 下一篇我會提到利用這個觀念,產生的延續性伺服器的想法 -- lighty RoR 是一個介紹 lighttpd , SQLite , Ruby and Rails 的 Blog http://lightyror.blogspot.com/ --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.218.90.242 ※ 編輯: giive 來自: 61.218.90.242 (09/13 14:30)







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BabyMother站內搜尋

TOP