私の知る限り、この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)