我正在学习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
正在扼杀我...我不知道这两行的结果是什么......
非常感谢你!
答案 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})