摘自 The Well-grounded Ruby

def args_unleashed(a, b=1, *c, d, e)
  puts "Arguments:"
  p a,b,c,d,e
end

# 问以下命令分别输出什么?
args_unleashed(1,2,3,4,5)
args_unleashed(1,2,3,4)
args_unleashed(1,2,3)
args_unleashed(1,2,3,4,5,6,7,8)
args_unleashed(1,2)

这个例子非常清楚地概括了在 Ruby 里常用的几种参数,以及使用方法。

  • 参数
    • 必需 (required)
      • 带默认值
      • 不带默认值
    • 可选 (optional)

上段代码的输出值依次分别是

Argumentes: 1, 2, [3], 4, 5
Argumentes: 1, 2, [], 3, 4
Argumentes: 1, 1, [], 2, 3
Argumentes: 1, 2, [3, 4, 5, 6], 7, 8
ArgumentError: wrong number of arguments (2 for 3+)

这里面,b 是带默认值的必需参数,*c 是可选参数,其余的是不带默认值的必需参数。要注意的是 Ruby 对输入参数的取值顺序

  1. 不带默认值的必需参数
  2. 带默认值得必需参数
  3. 可选参数

所以,对于 args_unleashed 这个函数,对于输入的参数,Ruby 会按次数地去取第一个赋值给 a,然后去末两位分别赋值给 de,剩下的再按顺序赋值给 b ,最后剩下的作为一个 Array 全部赋值给 *c

要调用 args_unleashed 这个函数,因为定义的时候有 3 个是不带默认值的必需参数,所以至少要赋予至少3个或3个以上的参数,否则就会报错。