2016-01-30 27 views
0

我的方法是目前這樣的:紅寶石法局部變量 - 簡單的重構的情況下

def calculate 
    bill = 0 
    order.each {|k, v| bill += restaurant.show_menu[k]*v} 
    bill 
end 

它看起來真的很醜,但我需要它返回bill。考慮將bill作爲實例變量,並因此在我的對象初始化時定義它,但我不在其他地方使用它。什麼是重構這個最好的方法?

+3

看起來'訂單'和'餐廳'是方法,但你沒有提供任何解釋。請詳細說明。 –

+0

你爲什麼覺得它很難受?局部變量有什麼問題? – Meier

+0

有幾個Ruby方法來解決這種問題。 – sbs

回答

7

這裏是一種可能的方式:

def calculate 
    order.reduce(0) {|bill, (k, v)| bill + restaurant.show_menu[k]*v} 
end 
+0

謝謝。我以前見過reduce方法,但我不知道在這種情況下使用它。 – ugotchi

+1

@ggwc你可能想接受一個答案,如果有幫助..看看[如何接受答案](http://meta.stackexchange.com/a/5235/226854)。你會得到+2分,許多新用戶似乎錯過接受答案。你之前的問題有一個很好的答案,請接受一個。如果您對目前的答案不滿意,可以等待幾小時或幾天後再接受。 –

+0

@ggwc您還可以使用'map'和'reduce'來分隔各個步驟,例如'order.map {| k,v | restaurant.show_menu [k] * v} .reduce(0,:+)' – Stefan

3
def calculate 
    order.map { |k, v| restaurant.show_menu[k] * v }.reduce(:+) 
end 

map返回一個數組包含值; reduce在每個元素上應用:+方法,這意味着總結它們。