0

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

当然,我可以为此使用 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)
4

3 回答 3

7

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

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

请注意,尽管您调用了 list indices,但 7、9、8、2、13 和 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(and all Seq)的特定情况下,isDefinedAt(i)如果 ,则返回 true 0 <= i < list.size,否则返回 false,并且list(i)仅在返回 false 时抛出异常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 回答