有没有任何使用情况的数组#推(unshift)没有参数?

问题描述:

我很惊讶地发现Ruby的Array#push(和Array#unshift)可以在没有参数的情况下调用,它们什么都不做。有没有任何使用情况的数组#推(unshift)没有参数?

在我看来,提高ArgumentError似乎是更合适的行为,当没有参数传递给这些方法(就像Python中的append)。

是否有任何用于Array#pushArray#unshift)的用例没有参数?

+0

让我们将这个问题颠倒过来:是否有任何用于“ArgumentError”的用例?为什么这是可取的? – Stefan

+0

如果没有参数的'Array#concat'不会引发'ArgumentError'?如果没有参数的'Array# 5t111111

+0

'concat'和' Stefan

The documentation明确列出了一个强制参数。

但是,Ruby Spec Suite显示了传递0参数的示例。

MRI/YARV test suite也明确表明传递0参数应该是可能的,但是有一条注释行实际上测试了相反,即传递0个参数会引发一个异常,并且有一个注释说这个特性是在Ruby 1.8中引入。

因此,很明显,在Ruby 1.6和更早版本中,曾经有一个必需的参数,而Ruby 1.8引入了任意数量参数的可能性。我能想到的唯一用例是溅出一个可能为空的数组或nil而不会引发错误。

+1

您提到的用例似乎并不罕见。例如,'[1,2] .push(* [3,4,5] .find {| x | x> 3})#=> [1,2,4]','[1,2]。 push(* [3,4,5] .find {| x | x> 6})#=> [1,2]','[1,2] .unshift(* [3,4,5] .select (&:odd?))#=> [3,5,1,2]','[1,2] .unshift(* [3,5,7] .select(&:even?))#=> [1,2]'。 –

+0

它不只是溅出一个可能为空的数组。所有以下返回'[“a”,“b”]':'[“a”,“b”]。push(* {})','[“a”,“b” (* 3..1)'(可能是因为splat将它们全部转换为数组)。但是,'[“a”,“b”]。push(*“”)#=> [“a”,“b”,“”]'。 –