作者godfat (godfat 真常)
看板Ruby
标题[心得] functional ruby
时间Sat Aug 18 21:17:54 2007
最近没什麽文章﹍
前几篇提到的 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)
1F:推 poga:看不懂一推qq 08/18 21:53
2F:→ poga:勉强懂5成 Orz 08/18 21:53