2013-10-30 138 views
-1

所以我正在通過rubymonk網站的Ruby方法的一些示例工作,並且無法解釋下面的代碼中發生了什麼。更具體地說,我希望有人能夠以通俗的語言來幫助解釋'calculate'方法的代碼中的每一行是如何描述的?我非常感謝任何幫助!Ruby方法說明

def add(*numbers) 
    numbers.inject(0) { |sum, number| sum + number } 
    end 

def subtract(*numbers) 
    sum = numbers.shift 
    numbers.inject(sum) { |sum, number| sum - number } 
end 

def calculate(*arguments) 
    options = arguments[-1].is_a?(Hash) ? arguments.pop : {} 
    options[:add] = true if options.empty? 
    return add(*arguments) if options[:add] 
    return subtract(*arguments) if options[:subtract] 
end 

回答

1
options = arguments[-1].is_a?(Hash) ? arguments.pop : {} 

創建一個新的哈希叫options。這將被分配給參數數組中的最後一個元素,或者如果它不是散列,則爲空。在ruby中,像python一樣,使用-1作爲數組索引可以獲得數組中的最後一個元素。

options[:add] = true if options.empty? 

設置在關鍵:add匹配爲true,如果你剛剛創建的哈希值是空的哈希值。

return add(*arguments) if options[:add] 
return subtract(*arguments) if options[:subtract] 

回報addsubtract與您傳遞給此功能,根據您剛纔創建的options散的狀態參數相同的結果。

例如:

arguments = [{}, {:add => false, :subtract => true}] 

如果用作您的參數將誘導減法方法。

+0

非常感謝Kepani。你能否給我一個具體的例子來說明如何傳遞參數會導致加法或減法? – John

+0

@s_jw回答用快速示例更新。 – yamafontes

+0

再次感謝!最後一個問題是,如何將「計算」方法(以及哪些元素作爲參數)稱爲生成剛纔提供的示例。我對很多問題表示歉意,我是一個新手,一直試圖讓這個在我腦海中變得有意義,所以我試圖弄清楚一切從頭到尾如何工作。 – John