如何将切片转换为序列?

时间:2015-04-16 19:05:02

标签: nim nimrod

我想直接从切片指定一个序列(而不是遍历切片并将每个元素分别添加到序列中)。我尝试了几种不同的方法,但显而易见的方法似乎不起作用。

var 
    x = newSeq(1..n)
    y: seq[int] = @[1..n]
    z: seq[int] = 1..n

我唯一能够开展工作的是从future

导入列表推导
var x: seq[int] = lc[x | (x <- 1..n), int]

我在文档中找不到任何方法可以做到这一点,不涉及从未来导入实验性的东西或自己重载序列构造函数。

2 个答案:

答案 0 :(得分:5)

https://nim-lang.org/docs/sequtils.html#toSeq.t,untyped

import sequtils
var x = toSeq 1..n

作为参考,您也可以编写自己的实现来将切片转换为seq:

proc toSeq2[T](s: Slice[T]): seq[T] =
  result = @[]
  for x in s.a .. s.b:
    result.add x

答案 1 :(得分:3)

这对于大切片具有良好的性能,因为不会有内存重新分配:

proc sliceToSeq[T](s: Slice[T]): seq[T] =
  result = newSeq[T](ord(s.b) - ord(s.a) + 1)
  var i = 0
  for x in s.a .. s.b:
    result[i] = x
    inc(i)