Re: [心得] functional ruby
我成功把那個多餘的變數拿掉了 @_@
原本是:
result = result.zip(match[1..4].map(&:to_i)).map{|data| data.inject(&:+)}
改成:
result = result.zip(match[1..4].map(&:to_i)).map(&:'inject(&:+)')
當然,哪有直接改就能用的便宜事,這需要修改 Symbol#to_proc 的實作,
原本的實作是:
def to_proc; lambda{|*args| args.shift.__send__ self, *args}; end
由於他是只送出一個訊息,所以上面那樣當然不會有:inject(&:+) 這種 method.
重新實做過後的 to_proc, 把行為轉換成直接 eval symbol 本身這個 message:
def to_proc
lambda{|*args| eval "args[0].#{self.to_s} #{args[1..-1].join ', '}" }
end
也就是說,呼叫
[[1,2],[3,4]].map(&:'inject(&:+)')
會等同於:
[[1,2],[3,4]].map{ |data|
data.inject(&:+)
}
所以答案會是:[3,7]
不過由於 Symbol#to_proc 很多地方都有實作,我直接這樣改其實還滿容易打架的。
像之前想讓 NilClass#method_missing 回傳 Blackhole 就會碰到這個問題﹍。
所以其實也許改名為 to_msg 之類的會比較好?anyway, 額外做個 alias 也好:
alias_method :to_msg, :to_proc
如果有衝突就用 to_msg 吧 XD
--
Nobody can take anything away from him.
Nor can anyone give anything to him.
What came from the sea,
has returned to the sea.
Chrono Cross
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.135.28.18
討論串 (同標題文章)
完整討論串 (本文為第 2 之 2 篇):
Ruby 近期熱門文章
PTT數位生活區 即時熱門文章