0

私の知る限り、このisDefinedAtメソッドはtypescontainsメソッドのように機能するはずです。しかし、不思議なことに、動作が異なります。要素が繰り返し発生するかどうかはチェックされません。

val randomizer = new Random

def next(acc: List[Int], n: Int): List[Int] = {
   if(n > 0) {
      val r = randomizer.nextInt(15)
      println("generating, r=" + r + " is defined=" + acc.isDefinedAt(r))
      if(!acc.isDefinedAt(r)) next(r :: acc, n - 1) // check for NO coincidence
      else next(acc, n)
   } else acc
}

println("indices = " + next(List[Int](), 6))

もちろん、リストの代わりにセットを使用することもできますが、それでも、なぜこのように動作するのでしょうか。

私が得る出力は次のようなものです

generating, r=8 is defined=false
generating, r=13 is defined=false
generating, r=2 is defined=false
generating, r=8 is defined=false
generating, r=9 is defined=false
generating, r=3 is defined=true
generating, r=2 is defined=true
generating, r=7 is defined=false

indices = List(7, 9, 8, 2, 13, 8)
4

3 に答える 3

7

このisDefineAtメソッドは、特定の部分関数が特定の引数に対して定義されているかどうか、つまり、特定の引数を使用して呼び出すときに値が得られるかどうかを示します。

リストはインデックスから値までの部分関数として扱われるためisDefinedAt、特定のインデックスがリストに対して有効かどうかがわかります。与えられた値がリストに含まれているかどうかはわかりません。それcontainsが目的です。

リストを呼び出したにもかかわらず、7、9、8、2、13、indicesおよび8がそのリストのであることに注意してください。そのリストのインデックスは0、1、2、3、4、5です。

于 2012-06-01T13:03:03.417 に答える
5

あなたはの意味を誤解していますisDefindAt、それはとしては機能しませんcontains。ドキュメントが言うように:

def isDefinedAt(x:Int):ブール値

このリストに特定のインデックスが含まれているかどうかをテストします。

戻り値

true if this list contains an element at position idx, false otherwise.

isDefinedAt(x)と等しい0<= x && x< list.size

于 2012-06-01T13:06:06.667 に答える
3

関数が引数を受け入れisDefinedAtないかどうかを通知するだけです。つまり、をisDefinedAt返す場合false、関数がその値をカバーしていないことがわかります。の場合true、値をカバーするか、例外をスローする可能性があります。

List(およびすべてのSeq)の特定のケースでは、がの場合はisDefinedAt(i)trueを返し0 <= i < list.size、それ以外の場合はfalseを返し、falseを返したlist(i)場合にのみ例外をスローしisDefinedAt(i)ます。

とにかく、それを試してみましょう:

scala> val list = List("a", "b", "c")
list: List[String] = List(a, b, c)

scala> list.isDefinedAt(0)
res0: Boolean = true

scala> list(0)
res1: String = a


scala> list.isDefinedAt(-1)
res3: Boolean = false

scala> list(-1)
java.lang.IndexOutOfBoundsException: -1


scala> list.isDefinedAt(2)
res5: Boolean = true

scala> list(2)
res6: String = c
于 2012-06-01T21:45:11.450 に答える