3

我想将 a 转换string为 a,seq[char]以便可以在 sequtils 中使用一些 proc,但我遇到了toSeq模板问题。

例如:

proc someproc(a, b: string): seq[tuple[a, b: char]] =
    let
        s1 = toSeq(a)
        s2 = toSeq(b)
    result = zip(s1, s2)

给出编译错误:

lib/pure/collections/sequtils.nim(329, 20) Error: type mismatch: got (seq[string], char)
but expected one of:
system.add(x: var string, y: char)
system.add(x: var string, y: string)
system.add(x: var seq[T], y: T)
system.add(x: var string, y: cstring)
system.add(x: var seq[T], y: openarray[T])

查看该模板:https ://github.com/Araq/Nim/blob/master/lib/pure/collections/sequtils.nim#L292

我看到序列的类型是由iter参数决定的,在这种情况下是string而不是char. 这是模板中的错误,还是我错误地使用了此模板?

我正在使用一个相当新的 10.3 版本的 Nim

4

1 回答 1

2

问题是您的表达式本身不是迭代器。我可以通过调用来使您的示例正常工作,即将显式items转换string为迭代器:

proc someproc(a, b: string): seq[tuple[a, b: char]] =
  let
    s1 = toSeq(a.items)
    s2 = toSeq(b.items)
  result = zip(s1, s2)

这是否属于我不知道的错误。如果你打电话toSeq给任何不允许做的事情for x in <your_expression>,你会得到一个有意义的错误。在您的情况下,这确实有效,因为 astring可以转换为迭代器。但是,返回类型的类型在上面的行中确定,您将简单地得到seq[string]. 尽管如此,在 Github 上提交问题可能不会有什么坏处。

于 2015-04-29T18:30:09.993 回答