NIM 的基本字符串格式化

Basic string formatting with NIM

我正在尝试进行一些非常基本的字符串格式化,但立即卡住了。

这段代码有什么问题?

import strutils
import parseopt2

for kind, key, val in getopt():
    echo "  " % [kind, key, val]

我得到 Error: type mismatch: got (TaintedString) but expected 'CmdLineKind = enum' 但我不知道该如何解决。

这里的问题是 Nim 的格式化运算符 % 需要一个具有相同类型的对象数组。由于此处数组的第一个元素具有 CmdLineKind 枚举类型,因此编译器期望其余元素具有相同的类型。显然,您真正想要的是所有元素都具有 string 类型,您可以通过将第一个参数显式转换为字符串(使用 $ 运算符)来强制执行此操作。

import strutils
import parseopt2

for kind, key, val in getopt():
  echo "  " % [$kind, key, val]

以防万一,您还想知道错误消息中出现的 TaintedString 类型是什么,这是一种特殊类型,表示对程序的外部输入未经验证。由于未经验证的输入数据会带来安全风险,因此该语言支持特殊的 "taint mode",它可以帮助您跟踪输入可能需要验证的位置。此模式的灵感来自 Perl 编程语言中可用的一组类似功能:

http://docstore.mik.ua/orelly/linux/cgi/ch08_04.htm

如果使用strformat Nim内置库,同样的代码片段可以更简洁:

import parseopt # parseopt2 has been deprecated!
import strformat

for kind, key, val in getopt():
    echo fmt"{kind} {key} {val}"

另请注意,parseopt 替换了已弃用的 parseopt2 库,至少在今天的 Nim 0.19.2 上是这样。