4

我看到了一个这样定义和使用的方法:

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

4 回答 4

3

splat 感觉很自然,因为这种方法可以合理地应用于单个或多个名称。需要将单个参数放在数组大括号中很烦人且容易出错,例如mention('your courses rocked!', ['eallam']). 即使方法只适用于Array.

此外,没有理由不能将其他论点放入 with *names

def mention(status, arg2, arg3, *names)
def mention(status, *names, arg2, arg3)
于 2013-10-18T00:10:39.563 回答
2

正如 Cary Swoveland 和 vgoff 提到的,定义如下

def foo arg1, *args, arg2
  ...
end

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


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

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
于 2013-10-18T03:27:34.157 回答
2

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

于 2013-10-17T23:56:24.497 回答
1

它既关乎简洁的代码,也关乎灵活性。Splat 为您提供了灵活性,同时显式声明每个输入将您的方法绑定到更接近这些输入对象。如果代码稍后更改怎么办?如果您必须添加更多字段怎么办?你知道你会怎么称呼他们吗?如果您必须在其他地方使用这种方法来处理可变输入怎么办?Splat 增加了很多灵活性并保持方法声明简洁

列出太多参数也是一种代码味道。

看看这个:多少参数太多了?

在这里: 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.
于 2013-10-18T00:08:15.323 回答