Re: [心得] functional ruby

看板Ruby作者 (godfat 真常)時間17年前 (2007/08/18 23:53), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/2 (看更多)
我成功把那個多餘的變數拿掉了 @_@ 原本是: 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
文章代碼(AID): #16nnO0TI (Ruby)
討論串 (同標題文章)
文章代碼(AID): #16nnO0TI (Ruby)