Can';我不理解RubyMonk上的此方法教程

Can';我不理解RubyMonk上的此方法教程,ruby,methods,Ruby,Methods,我目前正在rubymonk.com上做练习,但就是想不起这个问题 我要写三种方法,加、减和计算。Calculate是一种结合了add和subtract方法的方法,具体取决于传递给该方法的最后一个参数,该参数应该是包含符号“:add”或“:subtract”的哈希 这是解决方案代码: def add(*numbers) numbers.inject(0) { |sum, number| sum + number } end def subtract(*numbers) sum =

我目前正在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 : {}
即使这样,我也明白发生了什么,但我不明白为什么会有第二个“?”或“:{}”出现。谁能给我解释一下这里发生了什么事


谢谢

评论实际上解释了这一点。另一种书写方式是:

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

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

它是一个三元逻辑运算符

格式为:

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

另外,{}是空哈希对象的构造函数-这是一个保护子句,用于确保赋值后
options
不会
nil

这很有意义,谢谢。我已经读过三元运算符了,但大约是前两章,我完全忘记了语法。谢谢你的帮助:)现在人们会写
def减法(*数字);数字。注入(&:-);end
sum=numbers.shift
通过注入方法完成:当未指定初始值时,则使用集合的第一个元素作为memo的初始值。
if arguments[-1].is_a?(Hash)
  arguments.pop
else
  {}
end