2

これはメソッドのバグですかindexWhere、それとも以下の例の最初の 4 行に意味のある説明がありますか?

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 に答える
0

将来の解決策として、チェックを行う独自のバージョンを実装することをお勧めします。-1 の代わりに Option を返すようにすることもできますが、これも安全ではありません。

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 に答える