2017-07-04 54 views
0

我有一個叫做Food的類;這是一個非常簡單的課程,它只有名字,價格和大卡。我創建3種Food使用reduce來求和數組中的對象的屬性

@Food1 = Food.new("Pear", 12, 120) 
@Food2 = Food.new("Apple", 15, 100) 
@Food3 = Food.new("Banana", 20, 200) 

然後我創建的食品稱爲Menu數組:

@Menu = [@Food1, @Food2, @Food3] 

我需要總結的所有pricesreduce方法,並將其存儲在@Food1。我已經實現了+方法爲food類:

def + (other) 
    @price + other.price 
end 

,我試圖做的事:

@Food1 = @Menu.reduce(:+) 

但它不工作。你有一些想法,我怎麼能達到這個?

+2

Ruby約定認爲變量和方法名應該全部小寫。在這種情況下,這是'@ food1'和'@ menu'。 – tadman

+0

「不工作」是什麼意思?有錯誤嗎? – tadman

+0

顯示你的其他相關部分代碼。沒有定義'initialize'方法,你的代碼將無法工作。沒有訪問器方法,你的代碼將無法工作。 – sawa

回答

3

最簡單的方法是按如下方式編寫它。

class Food 
    attr_reader :price 
    def initialize(name, price, kcal) 
    @name, @price, @kcal = name, price, kcal 
    end 
end 

food1 = Food.new("Pear", 12, 120) 
food2 = Food.new("Apple", 15, 100) 
food3 = Food.new("Banana", 20, 200) 
menu = [food1, food2, food3]`enter code here` 

menu.reduce(0) { |t,food| t+food.price } 
    #=> 47 

或(Ruby的V2.4 +)

menu.sum { |food| food.price } 

注意,我沒有定義food1food2food3menu實例變量。這樣做可能有其原因,但不僅僅是爲了獲得價格總和。

Food.new.price是一個整數,當然這個整數是Integer#+,所以沒有什麼特別的理由在類上定義和實例方法+

假設你是添加一個實例方法:+到類:

def +(other) 
    price + other.price 
end 

這將使你寫

food1 + food2 
    #=> 27 

(雖然它不是直觀的房價正在求和)。但是,你不能寫

food1 + food2 + food3 

是因爲第一次執行food1 + food2,返回27,然後試圖執行

27 + food3 

這是

27.+(food3) 

這裏:+是語法糖一個Integer方法,它不接受food3作爲參數,因此引發一個ex ception。

+1

...這就是爲什麼如果你希望你的對象像數字一樣行爲的話,你應該總是執行'coerce'。 –

相關問題