我试图做一些非常基本的字符串格式设置,但立即陷入困境。
此代码有什么问题?
import strutils
import parseopt2
for kind, key, val in getopt():
echo "$1 $2 $3" % [kind, key, val]
Run Code Online (Sandbox Code Playgroud)
我知道了,Error: type mismatch: got (TaintedString) but expected 'CmdLineKind = enum'但我不知道该如何解决。
这里的问题是Nim的格式运算符%期望具有相同类型的对象数组。由于此处数组的第一个元素具有CmdLineKind枚举类型,因此编译器希望其余元素具有相同的类型。显然,您真正想要的是所有元素都具有string类型,并且可以通过将第一个参数显式转换为字符串(使用$运算符)来强制执行此操作。
import strutils
import parseopt2
for kind, key, val in getopt():
echo "$1 $2 $3" % [$kind, key, val]
Run Code Online (Sandbox Code Playgroud)
如果您还想知道TaintedString错误消息中出现的是什么类型,这是一种特殊类型,指示未验证的程序外部输入。由于未经验证的输入数据会带来安全风险,因此该语言支持一种特殊的“污点模式”,该模式可帮助您跟踪可能需要验证输入的位置。此模式的灵感来自Perl编程语言中提供的一组类似功能:
http://docstore.mik.ua/orelly/linux/cgi/ch08_04.htm
如果使用strformatNim 内置库,相同的代码片段可以更简洁:
import parseopt # parseopt2 has been deprecated!
import strformat
for kind, key, val in getopt():
echo fmt"{kind} {key} {val}"
Run Code Online (Sandbox Code Playgroud)
另请注意,至少在 Nim 0.19.2 上,parseopt它取代了已弃用的库。parseopt2