2016-05-16 1 views
-1

私は今Ruby on RubyMonkを学んでおり、calculateメソッド - >def calculate(*arguments)というコードで苦労しています。コードの各行を私に説明することは可能でしょうか?私は各コード行の構文を知っていると思うが、論理は私には意味がないのだろうか?例えばRubyMonkのcalculateメソッドは何をしますか?

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は最後の要素です。したがって、arguments [-1]はメソッドに渡される最後の引数です。 is_a?(ハッシュ)は、引数がハッシュであるかどうかを判定します。 '?'と ':'は三項演算子を構成します。最後の引数がハッシュの場合は、配列からポップします。そうでない場合は、空のハッシュを与えてください。

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

この行は同等です:それはここで言っている何

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

呼び出し側は、彼らが何を望むかの操作を指定しなかった場合は、その後、彼らは加算を実行したいと仮定していることです。

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

options [:add]の場合はaddメソッドを呼び出し、結果を返します。呼び出し側が追加を指定した場合、または呼び出し側が操作を指定しなかった場合は、この行が実行され、メソッドがここに戻ります。他に何も実行されません。

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

オプション[:減算]の場合は、減算方法を呼び出して結果を返します。呼び出し元が減算を指定した場合(でない場合は)、この行が実行され、メソッドがここに戻ります。他に何も実行されません。

最後の引数として{:operation_not_supported => true}を渡すことで、明示的なreturn文をトリガーすることなく、このメソッドの最後に到達することができます。この場合、ルビの暗黙的な戻り値が得られます。これは実行された最後の行の値になります。これは、引数配列からオプションのハッシュを取得するものです。短いバージョン:このメソッドを呼び出すときにサポートされていない操作を指定すると、calculateメソッドでオプションのハッシュが返されます。

+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}) 
関連する問題