[心得] functional ruby
最近沒什麼文章﹍
前幾篇提到的 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
08/18 21:53, 1F
→
08/18 21:53, , 2F
08/18 21:53, 2F
討論串 (同標題文章)
完整討論串 (本文為第 1 之 2 篇):
Ruby 近期熱門文章
PTT數位生活區 即時熱門文章