5

我打电话tailArray,但看到一个警告。

scala> val arr = Array(1,2)
arr: Array[Int] = Array(1, 2)

scala> arr tail
warning: there were 1 feature warning(s); re-run with -feature for details
res3: Array[Int] = Array(2)

用于Array的Scaladocs显示了一个UnsupportedOperationException [will be thrown] if the mutable indexed sequence is empty.

是否有一种安全、不会抛出异常的方法来获取数组的尾部?

4

3 回答 3

14

是否有一种安全、不会抛出异常的方法来获取数组的尾部?

您可以使用drop

scala> Array(1, 2, 3).drop(1)
res0: Array[Int] = Array(2, 3)

scala> Array[Int]().drop(1)
res1: Array[Int] = Array()

另请注意,正如@TravisBrown在下面的评论中所提到的,drop不区分空尾(对于具有一个元素的集合)和没有尾(对于空集合),因为在这两种情况下,drop(1)都会返回一个空集合。

于 2013-09-06T01:14:57.157 回答
8

首先,警告与您使用不安全方法这一事实没有任何关系。如果您重新启动 REPL,-feature您将看到以下内容:

scala> arr tail
<console>:9: warning: postfix operator tail should be enabled
by making the implicit value language.postfixOps visible...

以及指向文档的指针scala.language.postfixOps,其中包括以下注释:

后缀运算符与分号推理的交互很差。大多数程序员出于这个原因避免使用它们。

这是个好建议。能够写作arr tail而不是arr.tail大惊小怪。

现在关于安全问题。标准库不提供tailOptionfor 集合,但您可以使用headOptionand获得相同的效果map

scala> val arr = Array(1, 2)
arr: Array[Int] = Array(1, 2)

scala> arr.headOption.map(_ => arr.tail)
res0: Option[Array[Int]] = Some([I@359be9fb)

如果这对您来说过于冗长、不透明或效率低下,您可以轻松创建一个隐式类,tailOptionArray(或Seq、或IndexedSeq等)添加一个更好的类。

于 2013-09-06T00:22:28.917 回答
0

请参阅@TravisBrown 的回答,了解您发出警告的原因。

我个人会scala.util.Try在数组的头部使用一个而不是他相当聪明的地图:

scala> val arr = Array(0, 1, 2)
arr: Array[Int] = Array(0, 1, 2)

scala> scala.util.Try {arr.tail} foreach {t => println(t.mkString(","))}
1,2
于 2013-09-06T15:24:25.117 回答