据我所知,该isDefinedAt方法应该像类型contains方法一样工作.但奇怪的是,它的行为有所不同 - 它不会检查重复出现的元素.
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))
Run Code Online (Sandbox Code Playgroud)
当然,我可以使用Sets而不是列表,但是,为什么它会像这样?
我得到的输出就像
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)
Run Code Online (Sandbox Code Playgroud)
该isDefineAt方法告诉您是否为给定的参数定义了一个给定的部分函数,即当您使用给定的参数调用它时它是否会给您一个值.
由于Lists被视为从索引到其值的部分函数,因此isDefinedAt将告诉您给定索引是否对List有效.它不会告诉您列表中是否包含给定值,这是什么contains.
请注意,尽管您调用了列表indices,但是7,9,8,2,13和8是该列表的值.该列表的索引是0,1,2,3,4和5.
你误解了isDefindAt它的意思,它不起作用contains.正如文档所说:
def isDefinedAt(x:Int):Boolean
测试此列表是否包含给定索引.
回报
Run Code Online (Sandbox Code Playgroud)true if this list contains an element at position idx, false otherwise.
所以isDefinedAt(x)等于0<= x && x< list.size