0

我有以下功能 -

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 calculate(*nums, options={}) ^

我的语法有什么错误?

4

2 回答 2

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

保持两者,但做更多的工作

查看@muistooshort 的回答

于 2012-07-27T06:21:31.750 回答
2

你也可以有你的 splat 和你的选择,你只需要手动整理它:

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

然后你可以毫无困难calculate(1, 2, 3)地说。calculate(1, 2, :size => 0)当然,这假设 Hash 不是nums.

于 2012-07-27T06:31:32.250 回答