2016-05-16 20 views
-1

我正在RubyMonk上學習Ruby,並且正在努力處理以下代碼:calculate方法 - >def calculate(*arguments)。是否有可能向我解釋每行代碼?我想我知道每個代碼行的語法,但邏輯對我沒有任何意義?RubyMonk的計算方法是做什麼的?

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) 
    # if the last argument is a Hash, extract it 
    # otherwise create an empty Hash 
    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 

例如,options死我了......我不知道是什麼導致了兩行的回報......

太謝謝你了!

+0

http://meta.stackoverflow.com/questions/253894/how-to-handle-explain-how-this-code-dump-works-問題/ 253896#comment17104_253896 –

回答

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

參數是一個數組。負數組索引從數組的末尾開始計數,其中-1是最後一個元素。所以參數[-1]是傳遞給方法的最後一個參數。 is_a?(散列)測試參數是否爲散列值。 '?'和':'組成三元操作符。如果最後一個參數是散列,則從數組中彈出它。如果不是,那就給我們一個空的散列。

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

此行等同於:

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

那是什麼想說的是,如果主叫方沒有說明他們想要的操作,再假設他們想執行加法。

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

調用add方法並返回結果如果選項[:add]。如果調用者指定了加法,或者調用者沒有指定任何操作,那麼將執行這一行,並且方法將返回到此處。沒有別的將被執行。

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

調用減法方法並返回結果if if [:subtract]。如果調用者指定了減法(並且不是指定了加法),那麼將執行該行並且方法將在此處返回。沒有別的將被執行。

請注意,通過傳遞{:operation_not_supported => true}作爲最後一個參數,可以在不觸發任何顯式返回語句的情況下到達此方法的結尾。在這種情況下,你會得到ruby的隱式返回值,這將是最後一行執行的值。這將是從參數數組中檢索選項哈希的那個。短版本:當您調用此方法時指定不支持的操作將使計算方法返回您的選項散列。

+0

非常感謝!明天會讀,看看我是否還有其他問題! :) – Penny

0

這只是這種用法的實現:

calculate(1, 2, 3, add: true)  #=> 6 (1 + 2 + 3) 
calculate(1, 2, 3, subtract: true) #=> -4 (1 - 2 - 3) 
calculate(1, 2, 3)     #=> 6 (option defaults to {add: true}) 
相關問題