无法在函数签名中发现语法错误

时间:2012-07-27 06:16:31

标签: ruby-on-rails ruby

我有以下功能 -

def add (*nums)
  nums.reduce(:+)
end

def subtract(first, *rest)
  first - rest.reduce(:+)
end

def calculate(*nums, options)
  first = nums.first
  rest = nums.reverse.drop(1)
  add(*nums) if options.size == 0
end     

以下是我在调用函数时收到的错误 -

  

语法错误,意外'=',期待')'def计算(* nums,   options = {})^

我的语法错误是什么?

2 个答案:

答案 0 :(得分:2)

splatted参数后,您不能拥有默认参数。这会给解析器带来歧义。例如:

calculate 1, 2, 3, 4

4应该转到nums还是分配到options

有几种选择

删除选项的默认参数

def calculate(*nums, options)
  # implementation
end

calculate 1, 2, 3, add: true # options
calculate 1, 2, 3, {} # no options

删除splat

def calculate(nums, options = {})
  # implementation
end

calculate [1, 2, 3], add: true # options
calculate [1, 2, 3] # no options

保持两者,但做更多工作

请参阅answer @muistooshort

答案 1 :(得分:2)

你也可以使用你的splat和你的选项,你只需要手工解决它:

def calculate(*nums)
  options = nums.last.is_a?(Hash) ? nums.pop : { }
  #...

然后您可以毫不费力地说calculate(1, 2, 3)calculate(1, 2, :size => 0)。当然,这假设Hash不是nums中某些内容的有效值。