2

这是indexWhere方法中的错误,还是对下面示例中的前四行有有意义的解释?

scala> List(1, 1, 4, 4, 4).indexWhere(_ > 3, -4)
res0: Int = -2

scala> List(1, 1, 4, 4, 4).indexWhere(_ > 3, -3)
res1: Int = -1

scala> List(1, 1, 4, 4, 4).indexWhere(_ > 3, -2)
res2: Int = 0

scala> List(1, 1, 4, 4, 4).indexWhere(_ > 3, -1)
res3: Int = 1

scala> List(1, 1, 4, 4, 4).indexWhere(_ > 3, 0)
res4: Int = 2

scala> List(1, 1, 4, 4, 4).indexWhere(_ > 3, 1)
res5: Int = 2

scala> List(1, 1, 4, 4, 4).indexWhere(_ > 3, 2)
res6: Int = 2

scala> List(1, 1, 4, 4, 4).indexWhere(_ > 3, 3)
res7: Int = 3

scala> List(1, 1, 4, 4, 4).indexWhere(_ > 3, 4)
res8: Int = 4

scala> List(1, 1, 4, 4, 4).indexWhere(_ > 3, 5)
res9: Int = -1
4

3 回答 3

3

我认为理想情况下你会看到一个IllegalArgumentException如果你传递一个负数作为开始索引(这到底是什么意思?),但也许觉得边界检查的开销是不值得的。我在文档中没有看到任何指定的行为,所以不确定我是否称之为错误;更多的是“垃圾进,垃圾出”的情况。

于 2013-11-15T11:07:25.423 回答
1

源代码如下所示:

override /*SeqLike*/
  def indexWhere(p: A => Boolean, from: Int): Int = {
    var i = from
    var these = this drop from
    while (these.nonEmpty) {
      if (p(these.head))
        return i

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

所以没有输入检查,也没有i变量归零。我会说这是一个错误。如果可以,请将其写在https://groups.google.com/forum/#!forum/scala-language开发人员可以查看的地方。

于 2013-11-15T11:28:35.343 回答
0

作为未来的解决方案,您可能希望实现自己的检查版本。你也可以让它返回一个 Option 而不是 -1,这也是不安全的:

implicit class WithIndexWhereSafe[T](seq: Seq[T]) { 
  def indexWhereSafe(p: T => Boolean, from: Int) = { 
    assert(from >= 0, "from must be >= 0")
    val i = seq.indexWhere(p, from) 
    if (i != -1)
      Some(i)
    else
      None
  }
}


List(1, 1, 4, 4, 4).indexWhereSafe(_ > 3, 2)  // Some(2)
List(1, 1, 4, 4, 4).indexWhereSafe(_ > 3, 5)  // None
List(1, 1, 4, 4, 4).indexWhereSafe(_ > 3, -4) // AssertionError
于 2013-11-15T14:36:30.133 回答