我有以下功能 -
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 = {})^
我的语法错误是什么?
答案 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
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
中某些内容的有效值。