如果我有一个带有类似参数列表的方法:
def func(param1, param2, param3, para4, param5, param6)
摆脱长长的清单的最佳方法是什么?有人建议创建一个单独的对象,但我不确定该怎么做。
您可以在 Ruby 中使用可变参数*
splat :
def f(*p)
p1,p2,p3,p4,p5,p6,p7,p8=*p
p p
p p8
end
f(*(1..8).to_a)
# [1, 2, 3, 4, 5, 6, 7, 8]
# 8
这里有权衡。您失去了解释器在计算实际传递给该方法的参数方面的帮助。
通过做:
p1,p2,p3,p4,p5,p6,p7,p8=*p
该方法的任何大于 8 的参数都将被静默忽略,如果小于 8,则不足将被静默地分配nil
:
> f(1,2,3)
[1, 2, 3]
nil
如果没问题,则*
是一个有用的快捷方式。
您还可以使用空数组作为默认参数:
def f2(p=[])
p1,p2,p3,p4,p5,p6,p7,p8=*p
p p
p p8
end
然后在没有splat的情况下调用,因为现在该方法需要一个参数,而不是一个变量:
f2(1..8)
关于数组长度的相同注释适用:大于 8 的参数长度将被静默忽略,小于 8 的参数将被静默分配nil
如果需要,您可以向可变长度参数添加参数检查:
def f(*p)
args_expected=8
raise ArgumentError, ""#{__method__}": wrong number of arguments (given %d expected %d)" % [p.length, args_expected] if p.length !=args_expected
p1,p2,p3,p4,p5,p6,p7,p8=*p
end
> f(1,2,3)
ArgumentError: "f": wrong number of arguments (given 3 expected 8)
但是现在你又增加了文字和复杂性。
如果您期望固定数量的参数,则有充分的理由使用命名位置参数。该功能易于更改,您可以让口译员帮助您。
建议使用带有参数的单个哈希作为键/选项。
def func(hash_param = {})
param1 = hash_param[:param1]
param2 = hash_param[:param2]
param3 = hash_param[:param3]
param4 = hash_param[:param4]
param5 = hash_param[:param5]
param6 = hash_param[:param6]
#rest_of_code
end
hash = {
param1: 'foo',
param2: 'bar',
param3: 'baz',
param4: 'qux',
param5: 'alice',
param6: 'bob'
}
func(hash)
如果未定义哈希中的某些特定键,它们将仅返回nil
。