0

我目前正在 ruby​​monk.com 上进行练习,但无法解决这个问题。

我打算写三种方法,加法、减法和计算。计算是一种结合了加法和减法的方法,具体取决于传递给方法的最后一个参数,它应该是一个包含符号 ':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 : {}

即使那样,我也明白发生了什么,但我不明白为什么会有第二个“?” 或者为什么存在':{}'。谁能向我解释这里发生了什么?

谢谢!

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 回答