RubyMonk的计算方法有什么作用?

时间:2016-05-16 02:54:24

标签: ruby methods

我正在学习Ruby on RubyMonk,现在正在努力学习以下代码:calculate方法 - > def calculate(*arguments)。您是否有可能向我解释每行代码?我想我知道每个代码行的语法是什么,但逻辑对我没有任何意义?

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正在扼杀我...我不知道这两行的结果是什么......

非常感谢你!

2 个答案:

答案 0 :(得分:1)

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

参数是一个数组。负数组索引从数组末尾开始计数,-1表示最后一个元素。所以arguments [-1]是传递给该方法的最后一个参数。 is_a?(Hash)测试参数是否为哈希值。 ''和':'组成三元运算符。如果最后一个参数是哈希,则从数组中弹出它。如果不是,那就给我们一个空的哈希。

options[:add] = true if options.empty?

这一行相当于:

if options.empty?
  options[:add] = true
end

它在这里说的是,如果来电者没有指定他们想要的操作,那么假设他们想要进行添加。

return add(*arguments) if options[:add]

如果选项[:add],则调用add方法并返回结果。如果调用者指定了添加,或者调用者没有指定任何操作,则将执行该行,并且该方法将在此处返回。没有别的东西会被执行。

return subtract(*arguments) if options[:subtract]

调用subtract方法并在选项[:subtract]时返回结果。如果调用者指定了减法(并且指定了添加),则将执行此行并且此方法将返回此处。没有别的东西会被执行。

请注意,可以在不触发任何显式返回语句的情况下到达此方法的末尾,基本上通过传递{:operation_not_supported => true}作为最后一个参数。在这种情况下,您将获得ruby的隐式返回,这将是执行的最后一行的值。哪个是从参数数组中检索选项哈希的那个。简短版本:在调用此方法时指定不受支持的操作将使compute方法返回您的选项哈希。

答案 1 :(得分:0)

它只是这种用法的实现:

calculate(1, 2, 3, add: true)       #=> 6  (1 + 2 + 3)
calculate(1, 2, 3, subtract: true)  #=> -4 (1 - 2 - 3)
calculate(1, 2, 3)                  #=> 6 (option defaults to {add: true})