0
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 = arguments[-1].is_a?(Hash) ? arguments.pop : {} 

ありがとう

4

2 に答える 2

4

明らかに、この関数はオプションの「オプション」ハッシュを整数のリストとともに引数として受け入れます。オプションは、引数のリストの最後に提供されます。そのため、関数はそれをチェックする必要があり、オプション ハッシュが存在する場合は、それをポップして options 変数に入れます。

于 2013-05-24T01:48:48.363 に答える
2

コードを実装する方法は、引数のリストを指定して calculate メソッドを呼び出すことです。そのリストでは、最後の引数がハッシュの場合、オプション ハッシュになります。arguments.pop を実行すると、引数リストからオプション ハッシュが抽出されます。

calculate(1,2,3,{add: false, subtract: true})結局戻ってくるsubtract(1,2,3)

やっている

calculate(1,2,3)結局電話するadd(1,2,3)

アップデート

他の回答に関するコメントに回答するには、メソッドとメソッドが実装されargumentsているため、変数からポップアウトする必要があります。これらのメソッドが引数のシフトを開始したり、引数に inject を使用したりすることに気付いた場合、最後の引数がハッシュである場合はあまり意味がありません。これが、変数を他のメソッドに送信する前にポップアウトされる理由です。addsubtractarguments

この実装は、任意の数の整数引数とオプションの last を渡すことができるため、興味深い方法ですoptions hash

通常、このように定義されたメソッドが表示されます

def testing(arg1, arg2, options={})
  # some manipulation of the args and options
end

しかし、それを処理するには、メソッドに渡したい引数ごとにパラメーターを作成する必要があります

于 2013-05-24T01:49:54.010 に答える