在为我的系统的某些部分编写测试时,我发现了一些奇怪的行为,经过仔细检查可归结为以下内容:
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)。"
答案 0 :(得分:3)
不,没有这样的保证,而且你非常强调显式这样说的文档行。在这里再次强调:
返回:生成大小为
size
,的列表的迭代器, 最后一个和 如果元素少于,则唯一的元素将被截断size
强>
因此,如果您的列表长度为n
,请致电.sliding(m)
,其中m > n
,是最后一个唯一的元素结果的长度为n
。
以下情况:
List(0).sliding(2)
只有一个元素(n = 1
),您调用sliding(2)
,即m = 2, 2 > 1
,这会导致结果的最后一个元素截断为1
。