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

显然,这个函数接受一个可选的“选项”哈希作为参数以及一个整数列表。选项在参数列表的末尾提供。因此该函数必须检查它,如果存在选项哈希,则将其弹出并将其放入选项变量中。

于 2013-05-24T01:48:48.363 回答
2

代码的实现方式是通过参数列表调用计算方法。在该列表中,最后一个参数如果它是一个哈希,它将是一个选项哈希。执行 arguments.pop 将从参数列表中提取选项哈希。

calculate(1,2,3,{add: false, subtract: true})最终会回来subtract(1,2,3)

正在做

calculate(1,2,3)最终会打电话add(1,2,3)

更新

要回答您对另一个答案的评论,您需要将其从arguments变量中弹出,因为addandsubtract方法的实现方式。如果您注意到这些方法开始转移参数或在参数上使用注入,如果最后一个参数是散列,这将没有多大意义。这就是为什么在将arguments变量发送到其他方法之前弹出它的原因。

这个实现是一种有趣的方法,因为它允许传入任意数量的整数参数和一个可选的 last options hash

通常你会看到这样定义的方法

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

但是这种处理方式需要您为可能要传递给方法的每个参数创建一个参数

于 2013-05-24T01:49:54.010 回答