在行迭代器上使用对

Using pairs on the lines iterator

有没有更优雅的方法来做到这一点?我想用for iLine, line in lines inputFile,所以加糖为pairs。但是,这似乎不适用于 lines 迭代器。我做错了什么,还是这根本不可能?

var iLine = 0
for line in lines inputFile:
    for iCell, cell in line:
        var val = false
        if cell == '#':
            val = true

        row[iCell] = val
    
    map[iLine] = row
    iLine += 1

我可能只为 File 定义 pairs,这样你就可以写

iterator pairs(f: File): (int, string) =
  var idx = 0
  for line in lines(f):
    yield (idx, line)
    inc idx

for idx, line in open("/tmp/a.nim"):
  echo idx

它可能有点模棱两可 - 例如lines 一个清楚地表明您正在迭代索引行。第二种选择是 return (int, string) 来自迭代器:

iterator idxLines(f: string): (int, string) =
  var idx = 0
  for line in lines(open(f)):
    yield (idx, line)
    inc idx

for idx, line in idxLines("/tmp/a.nim"):
  echo idx

您可以像这样使用 enumerate 迭代器:

import std / enumerate

for lnum, line in enumerate(lines inputFile):
  # Do your thing here.

此迭代器是在 Nim v1.4.0 中引入的,因此请确保您的版本是最新的。