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 编程语言中可用的一组类似功能:
如果使用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 上是这样。
我正在尝试进行一些非常基本的字符串格式化,但立即卡住了。
这段代码有什么问题?
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 编程语言中可用的一组类似功能:
如果使用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 上是这样。