Scala - List.isDefinedAt()表现得很奇怪

non*_*com 0 scala list

据我所知,该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)

sep*_*p2k 7

该isDefineAt方法告诉您是否为给定的参数定义了一个给定的部分函数,​​即当您使用给定的参数调用它时它是否会给您一个值.

由于Lists被视为从索引到其值的部分函数,​​因此isDefinedAt将告诉您给定索引是否对List有效.它不会告诉您列表中是否包含给定值,这是什么contains.

请注意,尽管您调用了列表indices,但是7,9,8,2,13和8是该列表的值.该列表的索引是0,1,2,3,4和5.


Eas*_*sun 5

你误解了isDefindAt它的意思,它不起作用contains.正如文档所说:

def isDefinedAt(x:Int):Boolean

测试此列表是否包含给定索引.

回报

true if this list contains an element at position idx, false otherwise.
Run Code Online (Sandbox Code Playgroud)

所以isDefinedAt(x)等于0<= x && x< list.size