使用NIM进行基本字符串格式化

时间:2017-02-27 11:07:45

标签: nim

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

此代码有什么问题?

import strutils
import parseopt2

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

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

2 个答案:

答案 0 :(得分:5)

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

$

如果您还想知道错误消息中出现的此import strutils import parseopt2 for kind, key, val in getopt(): echo "$1 $2 $3" % [$kind, key, val] 类型是什么,这是一种特殊类型,表示程序的未经验证的外部输入。由于未经验证的输入数据存在安全风险,因此该语言支持特殊"taint mode",可帮助您跟踪输入可能需要验证的位置。此模式的灵感来自Perl编程语言中提供的一组类似功能:

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

答案 1 :(得分:2)

如果您使用strformat Nim内置库,则相同的代码段可能更简洁:

import parseopt # parseopt2 has been deprecated!
import strformat

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

还请注意,至少从今天起,在Nim 0.19.2上,parseopt取代了已弃用的parseopt2库。