Scala List indexOf有bug吗?

时间:2016-12-30 10:58:11

标签: scala list indexof

我正在阅读List的scala API,我发现:indexOf(elem:A,from:Int)

所以我运行以下代码:

scala> List(1,3,5,8).indexOf(8,-2)
res393: Int = 1

scala> List(1,3,5,8).indexOf(8,-3)
res391: Int = 0

为什么会有这样的结果? 我的Scala版本是2.12.1(Java HotSpot(TM)64位服务器VM,Java 1.8.0)。

2 个答案:

答案 0 :(得分:1)

此行为不是错误,只是未定义(虽然非常令人惊讶,并且根据您使用的集合而不一致)。

List.indexOf最终会调用.indexWhere(在LinearSeqOptimized上),其中负数最终会改变结果:

override /*SeqLike*/
def indexWhere(p: A => Boolean, from: Int): Int = {
  var i = from                 // -3
  var these = this drop from   // no effect
  while (these.nonEmpty) {
    if (p(these.head))
      return i                 // may return a negative number

    i += 1
    these = these.tail
  }
  -1
}

如@adamwy在评论中所述,在.indexOf上使用负数调用Vector将不会产生相同的结果;它会调用.indexWhere(在IndexedSeqOptimized上):

override /*SeqLike*/
def indexWhere(p: A => Boolean, from: Int): Int = {
  val start = from max 0        // completely ignores negatives 'from' input
  negLength(start + segmentLength(!p(_), start))
}

答案 1 :(得分:0)

一个错误(虽然from为负数时确实没有明确的预期结果文档) - 并且感谢您的问题,它将在2.12.2中修复:https://github.com/scala/scala/pull/5621

所以 - 好抓!