0

現在、rubymonk.com で演習を行っていますが、この問題に頭を悩ませることはできません。

私は、加算、減算、計算の 3 つのメソッドを記述するつもりです。Calculate は、メソッドに渡された最後の引数に応じて加算メソッドと減算メソッドを組み合わせたメソッドです。これは、シンボル ':add' または ':subtract' を含むハッシュである必要があります。

これはソリューションコードです:

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 : {}

それでも、何が起こっているのかは理解できますが、2 番目の「?」がある理由がわかりません。またはなぜ ': {}' があるのですか。ここで何が起こっているのか誰か説明してくれませんか?

ありがとう!

4

2 に答える 2

1

コメントは実際にそれを説明しています。別の書き方は次のとおりです。

if (arguments[-1].is_a?(Hash)) {
  arguments.pop
}
else {
  {}
}

ここで、arguments[-1] は最後の引数を意味します。

于 2013-09-11T11:53:33.007 に答える
1

三項論理演算子です。

形式は次のとおりです。

<expression to evaluate> ? <result if expression> : <result if !expression>

したがって、あなたの場合、演算子は次の省略形です。

if arguments[-1].is_a?(Hash)
  arguments.pop
else
  {}
end

また、{} は空の Hash オブジェクトのコンストラクターです。これは、代入後に確実に行われoptionsないようにするためのガード句です。nil

于 2013-09-11T11:54:31.450 に答える