Scala Seq.sliding()违反了文档的基本原理?

时间:2014-03-09 13:00:52

标签: scala

在为我的系统的某些部分编写测试时,我发现了一些奇怪的行为,经过仔细检查可归结为以下内容:

scala> List(0, 1, 2, 3).sliding(2).toList
res36: List[List[Int]] = List(List(0, 1), List(1, 2), List(2, 3))

scala> List(0, 1, 2).sliding(2).toList
res37: List[List[Int]] = List(List(0, 1), List(1, 2))

scala> List(0, 1).sliding(2).toList
res38: List[List[Int]] = List(List(0, 1))

scala> List(0).sliding(2).toList //I mean the result of this line
res39: List[List[Int]] = List(List(0)) 

对我而言似乎是List.sliding(),而其他许多类型的sliding()实施都违反了docs中提供的保证:

def sliding(size: Int): Iterator[List[A]]
  

通过传递"滑动窗口&#34>对固定大小的块中的元素进行分组。   在他们身上(而不是分组他们,就像在分组中一样。)

     

尺寸:每组元素数量

     

返回:生成大小为的迭代器,除了最后一个和唯一的元素将被截断   元素大于

据我所知,可以保证所有可以使用sliding(2)返回的迭代器迭代的列表的长度为2。我发现很难相信这是一个错误,一直到当前版本的scala,所以也许对此有一个解释或者我误解了文档?

我正在使用" Scala版本2.10.3(OpenJDK 64位服务器VM,Java 1.7.0_25)。"

1 个答案:

答案 0 :(得分:3)

不,没有这样的保证,而且你非常强调显式这样说的文档行。在这里再次强调:

  

返回:生成大小为size的列表的迭代器, 最后一个和   如果元素少于,则唯一的元素将被截断   size

因此,如果您的列表长度为n,请致电.sliding(m),其中m > n是最后一个唯一的元素结果的长度为n

以下情况:

List(0).sliding(2)

只有一个元素(n = 1),您调用sliding(2),即m = 2, 2 > 1,这会导致结果的最后一个元素截断为1