我正在阅读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)。
答案 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
所以 - 好抓!