如果我有一个带有参数列表的方法,如:
def func(param1, param2, param3, para4, param5, param6)
什么是摆脱长名单的最佳方法?有人建议创建一个单独的对象,但我不确定如何做到这一点。
答案 0 :(得分:3)
您可以在Ruby中使用variadic *
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
这里有一些权衡。在计算实际传递给方法的args时,你失去了解释器的帮助。
通过做:
p1,p2,p3,p4,p5,p6,p7,p8=*p
任何超过8的方法的参数都将被默默忽略,如果小于8,则会以静默方式分配短缺nil
:
> f(1,2,3)
[1, 2, 3]
nil
如果可以,*
是一个有用的快捷方式。
您还可以使用空数组作为默认arg:
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)
但现在你正在添加单词和复杂性。
如果您期望固定数量的参数,则有充分的理由使用命名的位置参数。该功能很容易更改,您可以让翻译帮助您。
答案 1 :(得分:1)
建议使用带参数的单个哈希作为键/选项。
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
。