Ruby 为什么我们需要弹出散列来创建这个计算方法?

Ruby 为什么我们需要弹出散列来创建这个计算方法?,ruby,hash,Ruby,Hash,有人能用简单的英语向我解释一下为什么我们需要检查代码中的最后一个参数是否是散列,然后弹出它: 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(*argum

有人能用简单的英语向我解释一下为什么我们需要检查代码中的最后一个参数是否是散列,然后弹出它:

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”散列作为参数以及整数列表。这些选项在参数列表的末尾提供。因此,函数必须检查它,如果有选项散列,则将其弹出并放入options变量。

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

代码的实现方式是使用参数列表调用calculate方法。在该列表中,最后一个参数如果是散列,则将是选项散列。Doing arguments.pop将从参数列表中提取选项哈希

calculate(1,2,3,{add:false,subtract:true})
将返回
subtract(1,2,3)

calculate(1,2,3)
将调用
add(1,2,3)

更新

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

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

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

options = arguments[-1].is_a?(Hash) ? arguments.pop : {} 

但是这种处理方法需要为每个可能要传递到方法中的参数创建一个参数。代码的实现方式是通过调用带有参数列表的calculate方法。在该列表中,最后一个参数如果是散列,则将是选项散列。Doing arguments.pop将从参数列表中提取选项哈希

calculate(1,2,3,{add:false,subtract:true})
将返回
subtract(1,2,3)

calculate(1,2,3)
将调用
add(1,2,3)

更新

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

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

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

options = arguments[-1].is_a?(Hash) ? arguments.pop : {} 

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

为什么我们需要弹出它?为什么我们必须弹出它来执行散列?这是ruby中执行可选哈希的常用语法吗?因为如果不执行,选项哈希将作为参数输入加法器或减法器。这将是不好的。而且,是的,可选哈希在Ruby实现中非常常见,例如Rails,尽管它们的实现方式并不总是与该示例中的方式完全相同。为什么我们需要将其弹出呢?为什么我们必须弹出它来执行散列?这是ruby中执行可选哈希的常用语法吗?因为如果不执行,选项哈希将作为参数输入加法器或减法器。是的,可选哈希在Ruby实现中非常常见,比如Rails,尽管它们的实现方式并不总是和那个例子中的完全相同,因为它编写得很糟糕。如果它是由知道如何编写代码的人编写的,那么您就不会有这个问题,因为您只需阅读代码就可以理解正在发生的事情。:)@akonsu实际上,这种实现并没有那么糟糕。如果你懂这门语言,这是非常直观的。该实现对于未定义数量的参数和可选选项哈希非常有效。否则,该方法必须将整数数组作为第一个参数,然后是选项哈希。因为它写得不好。如果它是由知道如何编写代码的人编写的,那么您就不会有这个问题,因为您只需阅读代码就可以理解正在发生的事情。:)@akonsu实际上,这种实现并没有那么糟糕。如果你懂这门语言,这是非常直观的。该实现对于未定义数量的参数和可选选项哈希非常有效。否则,该方法必须将整数数组作为第一个参数,然后将选项散列。