给定一个序列序列的类型,如何将其转换为单个扁平的序列类型?考虑以下Ceylon代码:
Integer[] range(Integer max) { return [ for (idx in 1..max) idx ]; } Integer[] prod(Integer max, Integer occurrences) { Integer[][] nestedSequence = [for (occurrence in 1..occurrences) range(max)]; return // ??? something to produce a flattened sequence } assert (prod(2, 2) == [1, 2, 1, 2]);
我是第一次尝试使用Ceylon,并在教程和API文档中摸索着.该解压方法看起来有点接近我所需要的,但不完全是.
可变函数concatenate()
连接迭代,产生一个序列:
Integer[] prod(Integer max, Integer occurrences) { Integer[][] nestedSequence = [ for (occurrence in 1..occurrences) range(max) ]; return concatenate(*nestedSequence); }
这可以像下面那样冗长地重写:
Integer[] prod(Integer max, Integer occurrences) => concatenate(for (occurrence in 1..occurrences) range(max));
但是我不喜欢这个实现,因为它对序列进行了大量的热切实例化.我更喜欢这个实现,它只进行一次序列实例化:
Integer[] prod4(Integer max, Integer occurrences) => [ for (occurrence in 1..occurrences) for (x in range(max)) x ];
仅供参考,在锡兰1.1中,expand()
添加了比其更加懒散的功能concatenate()
.
HTH,祝你好运!