2013-11-25 245 views
0

一個會如何改寫inject方法,但在Ruby中,基本上有重寫注射方法在紅寶石

(5..10).inject { |sum, n| sum + n } == (5..10).new_inject { |sum, n| sum + n } 

評估爲true。對不使用的method_missing ...

編輯:

按照要求,這是我到目前爲止有:

module Enumerable 
    def new_inject(&block) 
    if block_given? 
     a ||= self.first 
     self[1..-1].each do |s| 
     @result = block.call(a,s) 
     end 
    end 
    @result 
    end 
end 
+3

對於總和明確,或更普遍?另外,你可以展示你到目前爲止的內容嗎? –

+0

這只是一個練習?您正在嘗試重新創建注入而不使用注入?在你的代碼中,到目前爲止'[1 ..- 1]'將會放棄第一個元素,不知道這是否是你的意圖。只是普通的'每個'(不需要自己)就會遍歷整個範圍。 – numbers1311407

+0

@ numbers1311407'[1 ..- 1]'不放棄最後一個元素,它排除第一個元素。 – dbenhur

回答

3

的大部分紅寶石STDLIB的純Ruby實現的優秀案例可以在Rubinius中找到;這裏的inject

在你嘗試我發現幾個錯誤:

  1. 你沒有的inject權的簽名,有四個變種。
  2. 您假設self responds_to :[]這不是全部由Enumerable s填寫的承諾。
  3. 您未能更新您的循環中的累加器a
  4. 您應該優先使用yieldblock.call(它的速度更快)