[心得] functional ruby

看板Ruby作者 (godfat 真常)時間17年前 (2007/08/18 21:17), 編輯推噓1(101)
留言2則, 1人參與, 最新討論串1/2 (看更多)
最近沒什麼文章﹍ 前幾篇提到的 ludy, 裡面有一些 unit test, 可以單獨執行一個 unit test, 也弄了一次跑全部的 unit test, 看 programming ruby 的說法是,只要全部 require 進來就好了。 是這樣沒錯,確實可以跑,問題是真的是跑很慢﹍﹍。 我不太懂為什麼,但因為跑這麼慢,我決定換另外一種方式, 也就是直接批次單一執行就好。 缺點是,這樣就會輸出一大堆訊息,沒辦法看到 overview. 優點是,就算哪一個 unit test 有問題,也不會因此停下來, 這是真正的 unit test XD 不過我還是想看 overview, 所以我去抓輸出訊息, 把 0 tests, 0 assertions, 0 faliures, 0 errors 這一條抓下來,然後統計這四個數字。 m = output.match /(\d+) tests, (\d+) assertions, (\d+) failures, (\d+) errors/ 然後加到紀錄上: result = result.zip(m[1..4].map(&:to_i)).map{|data| data.inject(&:+)} 我有點好奇的是,這一行不知道會不會被嫌太難懂? 最近由於之前寫 Haskell 的關係,不知不覺都會用比較 functional 的 style 不熟悉的人也許要看一陣子才能懂,但是我相信寫慣 fp 的人, 應該看了就知道是什麼意思吧?簡單解釋行為如下: result = [0]*4 # 一開始初始化為 [0,0,0,0] 分別表示四個數字 抓到的結果會是:%w{1 2 3 4}, 也就是 ['1', '2', '3', '4'] 的字串陣列 這就是取 m[1..4] 的結果。m[0] 是整個字串。 要相加,當然要把字串變成數字,所以呼叫 map &:to_i, 結果就會是:[1,2,3,4] 接下來要怎麼依序加進去?當然,each_with_index 可以解決這件事, 不過這樣整個程序就必須拉長了,很討厭。比較簡單的方法就是 zip, 將兩個 array 以對齊的方式合併,如: [0,0,0,0].zip [1,2,3,4] 就會是 [0,0,0,0] [1,2,3,4] => [[0,1], [0,2], [0,3], [0,4]] 接下來讓他們各自相加合併,呼叫 inject &:+ (fp 中一般是叫 fold), 就會變成: [1, 2, 3, 4] 了。 可惜 ruby 大概是不能做這種事: &:inject(&:+) 可以的話就可以省略那個 data 了 XD 做為下一次 ludy 的擴充計畫好了﹍ -- 「行け!Loki!」(rocky ロッキー) -Gurumin ぐるみん 王子? XD -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.135.28.18 ※ 編輯: godfat 來自: 220.135.28.18 (08/18 21:43)

08/18 21:53, , 1F
看不懂一推qq
08/18 21:53, 1F

08/18 21:53, , 2F
勉強懂5成 Orz
08/18 21:53, 2F
文章代碼(AID): #16nl65W1 (Ruby)
討論串 (同標題文章)
文章代碼(AID): #16nl65W1 (Ruby)