Ruby - 减少ruby中的数字数组返回奇怪的结果

时间:2015-02-21 20:10:12

标签: ruby mapreduce keyword-argument splat

我尝试编写一个名为calculate的方法,根据传递给它的关键字参数确定addsubtract个数字。

这里是方法:

def add(*num)
  num.inject(:+)
end

def subtract(*num)
  num.reduce(:-)
end

def calculate(*num, **op)
  return add(num) if op[:add] || op.empty?
  return subtract(num) if op[:subtract]
end

puts calculate(1, 2, 3, add: true)
puts calculate(1, 2, 3, subtract: true)

当我运行此功能时,我得到了这个结果:

1
2
3

1
2
3

2 个答案:

答案 0 :(得分:2)

puts是你的朋友:

def add(*num)
  puts "in add, num = #{num}, num.size = #{num.size}"
  num.inject(:+)
end

def calculate(*num, **op)
  puts "num = #{num}, op = #{op}"
  return add(num) if op[:add] || op.empty?
end

calculate(1, 2, 3, add: true)
  # num = [1, 2, 3], op = {:add=>true}
  # in add, num = [[1, 2, 3]], num.size = 1
  #=> nil

现在修复calculate

def calculate(*num, **op)
  puts "num = #{num}, op = #{op}"
  return add(*num) if op[:add] || op.empty?
end

calculate(1, 2, 3, add: true)
  # num = [1, 2, 3], op = {:add=>true}
  # in add, num = [1, 2, 3], num.size = 3
  # => 6 

答案 1 :(得分:0)

你写道:

return add(*num) if opt[:add] || opt.empty?

同样修改return减去..部分也是。

使用您发布的代码num变为[[1,2,3]],因此[[1,2,3]] .inject(:+)返回接收器。你打电话给它,所以它输出就像你得到的那样。