2014-11-13 47 views
0

試圖使用可枚舉 mixin使我的類中的所有標準迭代器名爲NumberArray。從那我試圖使用注入迭代器來獲取數組中的奇數的平均值。使用Enumerable使標準迭代器可用來修改迭代器

我的代碼看起來像這樣

class NumberArray 
    include Enumerable 
    def initialize 
    @numbers = Array.new 
    end 

然後@numbers則數組充滿了1000個號碼

,最後我想創建自己的注入迭代器取得奇數值的平均值。

def inject 

    puts self.inject{|sum,x| sum = sum + x if sum mod 2 == 1} 

    asum 
    end 

我對Ruby很新。使用該Enumerable混入必須

回答

1

你,你可以想也只是子陣列和重寫方法:

class NumberArray < Array 
    def inject 
    odds = select(&:odd?) 
    odds.inject(:+).to_f/odds.size 
    end 
end 

a = NumberArray.new([1,2,3,4,5]) 
a.inject # => 3.0 

如果它使任何意義,做這種方式是另一回事,但是這是你問:)

2

類具有each方法,其產生對於每個連續元素。

由於您NumberArray類是由一個普通陣列的支持,你可以使用數組的each方法:

class NumberArray 
    # ... 
    def each 
    @numbers.each 
    end 
end 

至於你inject方法,當你調用self.inject,它只是叫你當前所在的方法再次。這稱爲遞歸,在這種情況下將導致SystemStackError。我也不建議重新定義NumberArray中的inject方法,因爲它將覆蓋injectEnumerable實現。

我會使用一個更具描述性的方法名狀odd_avg

def odd_avg 
    odds = @numbers.select(&:odd?) 
    odds.inject(:+).to_f/odds.size 
end 

這種方法的第一行會從@numbers所有的奇數元素,並將其放入odds。下一行首先獲得odds的總和,然後將總和轉換爲浮點數,然後除以賠率的數量。