Nim 中的字符串到底是什么?

What exactly are strings in Nim?

据我了解,Nim 中的字符串基本上是一个可变的字节序列,它们在赋值时被复制。

鉴于此,我假设 sizeof 会告诉我(如 len)字节数,但在我的 64 位机器上它总是给出 8,所以好像拿着指针。

鉴于此,我有以下问题...

谢谢!

字符串的定义实际上在system.nim中,只是在另一个名字下:

type
  TGenericSeq {.compilerproc, pure, inheritable.} = object
    len, reserved: int
  PGenericSeq {.exportc.} = ptr TGenericSeq
  UncheckedCharArray {.unchecked.} = array[0..ArrayDummySize, char]
  # len and space without counting the terminating zero:
  NimStringDesc {.compilerproc, final.} = object of TGenericSeq
    data: UncheckedCharArray
  NimString = ptr NimStringDesc

因此,字符串是指向具有 lenreserveddata 字段的对象的原始指针。字符串的过程在 sysstr.nim.

中定义

默认情况下,字符串赋值的语义已被选择为与 Nim 中所有值类型(不是 ref 或 ptr)相同,因此您可以假设赋值创建一个副本。当不需要副本时,编译器可以将其忽略,但我不确定到目前为止发生了多少。将字符串传递给 proc 不会复制它们。没有优化可以防止字符串复制,直到它们发生变化。序列的行为方式相同。

您可以更改字符串和序列的默认赋值行为,方法是将它们标记为浅表,然后在赋值时不进行任何复制:

var s = "foo"
shallow s