字符串类型

所有字符串字面值都是 string 类型。Nim 中的字符串与字符序列非常相似。但是,Nim 中的字符串都是以零结尾,并且具有长度字段。 可以用内置的 len 过程检索长度,长度并不计算末尾的零。

除非先将字符串转换为 cstring 类型,否则无法访问末尾的零。末尾零可以保证在 O(1) 完成转换,而无需另行分配。

字符串的赋值运算符始终复制字符串。 & 运算符拼接字符串。

大多数原生 Nim 类型支持使用特殊的 $ 过程转换为字符串。

  1. echo 3 # 为 `int` 调用 `$`

每当用户创建特定的对象时,该过程实现提供了 string 表示。

  1. type
  2. Person = object
  3. name: string
  4. age: int
  5. proc `$`(p: Person): string = # `$` 始终返回字符串
  6. result = p.name & " 已经 " &
  7. $p.age & # 需要在 p.age 前添加 `$`,因为它是整数类型,而我们要将其转换成字符串
  8. "岁了。"

虽然也可以使用 $p.name ,但 $ 操作符不会对字符串做任何事。请注意,不能依赖 int 到 string 像 echo 过程一样自动转换。

字符串按字典顺序进行比较,所有比较运算符都可用。字符串可以像数组一样索引(下限为 0)。与数组不同的是,字符串可用于 case 语句:

  1. case paramStr(i)
  2. of "-v": incl(options, optVerbose)
  3. of "-h", "-?": incl(options, optHelp)
  4. else: write(stdout, "非法的命令行选项\n")

按照约定,所有字符串都是 UTF-8 格式,但这不是强制的要求。 例如,从二进制文件读取字符串时,得到的将是字节序列。 索引运算 s[i] 表示 s 的第 i 个 char ,而不是第 i 个 unichar 。 在unicode 模块的迭代器 runes 可用来迭代所有 unicode 字符。