单数组参数与多个参数

时间:2013-10-17 23:47:40

标签: ruby coding-style

我看到了一个定义并使用的方法:

def mention(status, *names)
  ...
end
mention('Your courses rocked!', 'eallam', 'greggpollack', 'jasonvanlue')

为什么不使用数组作为第二个参数而不是使用splat将参数组合到数组中?

def mention(status, names)
  ...
end
mention('Your courses rocked!', ['eallam', 'greggpollack', 'jasonvanlue'])

这也将允许更多的参数。

def mention(status, names, third_argument, fourth_argument)
  ...
end
mention('Your courses rocked!', ['eallam', 'greggpollack', 'jasonvanlue'], Time.now, current_user)

4 个答案:

答案 0 :(得分:3)

splat感觉很自然,因为这种方法可以合理地应用于单个或多个名称。令人烦恼并且容易出错,需要在数组括号中加入一个参数,例如mention('your courses rocked!', ['eallam'])。即使方法仅适用于Array,splat也经常保存击键。

此外,没有理由不能将您的其他参数放入*names

def mention(status, arg2, arg3, *names)
def mention(status, *names, arg2, arg3)

答案 1 :(得分:2)

splat更灵活。输入args比将它们放入数组更容易。

答案 2 :(得分:2)

正如Cary Swoveland和vgoff所提到的,像

这样的定义
def foo arg1, *args, arg2
  ...
end

是可能的,所以你的最后一点不成立。


这取决于用例。如果该方法采用自然作为数组给出的参数,那么用户传递数组会更容易。例如,假设一个方法将backtrace_locations(数组)作为其参数。那么最好有:

def foo arg1, backtrace_locations, arg2
  ...
end
foo("foo", $!.backtrace_locations, "bar")

而不是:

def foo arg1, *backtrace_locations, arg2
  ...
end
foo("foo", *$!.backtrace_locations, "bar")

在其他情况下,当用户键入灵活数量的参数时,正如Sean Mackesey所指出的那样,当只有一个元素时,用户可能会忘记元素周围的[],所以它更好:

def foo arg1, *args, arg2
  ...
end
foo("foo", "e1", "bar")
foo("foo", "e1", "e2", "e3", "bar")

而不是:

def foo arg1, args, arg2
  ...
end
foo("foo", ["e1"], "bar")
foo("foo", ["e1", "e2", "e3"], "bar")
foo("foo", "e1", "bar") # => An error likely to happen

答案 3 :(得分:1)

这都是关于清洁代码和灵活性的。 Splat为您提供了灵活性,同时明确声明每个输入将您的方法绑定到更接近这些输入对象。如果代码稍后更改怎么办?如果你必须添加更多字段怎么办?你知道你叫什么吗?如果你必须在其他地方使用变量输入的方法怎么办? Splat增加了很多灵活性并使方法声明保持简洁

列出太多的params也是一种代码味道。

检查出来:How many parameters are too many?

在这里:http://www.codinghorror.com/blog/2006/05/code-smells.html

Long Parameter List:
The more parameters a method has, the more complex it is.
Limit the number of parameters you need in a given method,
or use an object to combine the parameters.