试图重构ruby代码,因此参数列表不长

时间:2017-07-20 02:31:17

标签: ruby

如果我有一个带有参数列表的方法,如:

def func(param1, param2, param3, para4, param5, param6)

什么是摆脱长名单的最佳方法?有人建议创建一个单独的对象,但我不确定如何做到这一点。

2 个答案:

答案 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