无法理解RubyMonk上的这个方法教程

时间:2013-09-11 11:50:10

标签: ruby methods

我目前正在rubymonk.com上进行练习,但是我无法理解这个问题。

我打算写三种方法,加,减和计算。 Calculate是一种根据传递给方法的最后一个参数组合add和subtract方法的方法,该方法应该是包含符号':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 个答案:

答案 0 :(得分:1)

评论实际上解释了它。写它的另一种方法是:

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

其中arguments [-1]表示最后一个参数。

答案 1 :(得分:1)

这是一个三元逻辑运算符。

格式为:

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

因此,在您的情况下,运算符是:

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

此外,{}是空Hash对象的构造函数 - 这是一个guard子句,用于确保在赋值后options不会nil