定义Ruby函数时参数
摘自 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 对输入参数的取值顺序
- 不带默认值的必需参数
- 带默认值得必需参数
- 可选参数
所以,对于 args_unleashed
这个函数,对于输入的参数,Ruby 会按次数地去取第一个赋值给 a
,然后去末两位分别赋值给 d
和 e
,剩下的再按顺序赋值给 b
,最后剩下的作为一个 Array
全部赋值给 *c
。
要调用 args_unleashed
这个函数,因为定义的时候有 3 个是不带默认值的必需参数,所以至少要赋予至少3个或3个以上的参数,否则就会报错。