2015-04-29 8 views
2

Я хотел бы преобразовать string в seq[char], поэтому я могу использовать несколько проков в sequtils, но у меня проблема с шаблоном toSeq.toSeq (some_string) Тип Несоответствие

Например:

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

ответ

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>, то вы получите значимую ошибку. В вашем случае это работает, поскольку string может быть преобразован в итератор. Однако тип возвращаемого типа определяется в строке выше, и вы просто получите seq[string]. Тем не менее, вероятно, не помешает подать вопрос в Github.

+0

Основываясь на использовании цикла 'for' в руководстве nim, кажется, что в этой ситуации ожидается неявный вызов' items'. http://nim-lang.org/manual.html#implict-items-pairs-invocations –