作者godfat (godfat 真常)
看板Ruby
标题Re: [心得] functional ruby
时间Sat Aug 18 23:53:33 2007
我成功把那个多余的变数拿掉了 @_@
原本是:
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