Zig 中可以使用动态字符串吗?

gav*_*vin 5 string unicode zig

我刚刚开始使用 Zig,并且来自 C++ 和 Rust;

我很早就被一个似乎无法解决的难题所困扰。或者在互联网上找到任何地方。

这就是我所拥有的:

// this doesn't work
pub const User = struct {

  bot:       bool,
  id:        *const [*:0]u8,
  username:  *const [*:0]u8,

  pub fn init() User {
  
    return User {

      .bot      = false,
      .id       = "THIS_IS_ID",
      .username = "THIS_IS_USERNAME"
    
    };
  }

  ...

}

const user = User.init();


// this works vvv
id: *const [10:0]u8,
.id = "THIS_IS_ID",
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误:

// this doesn't work
pub const User = struct {

  bot:       bool,
  id:        *const [*:0]u8,
  username:  *const [*:0]u8,

  pub fn init() User {
  
    return User {

      .bot      = false,
      .id       = "THIS_IS_ID",
      .username = "THIS_IS_USERNAME"
    
    };
  }

  ...

}

const user = User.init();


// this works vvv
id: *const [10:0]u8,
.id = "THIS_IS_ID",
Run Code Online (Sandbox Code Playgroud)

我试图摆脱提出这个问题的目标是知道zig 中是否可以有动态字符串;如果是这样,怎么会这样?我在网上看到了一些自定义字符串结构,但想知道是否有一种方法可以实现此目的,而无需为其创建单独的类型/结构..?

谢谢您的帮助!

sig*_*god 3

使用[]const u8[]u8. 请参阅切片文档。

有何const变化:

// Can assign string literals
var id: []const u8 = "THIS_IS_ID";
// vs
// var id: []u8 = "THIS_IS_ID";
//                ^~~~~~~~~~~~
// error: expected type '[]u8', found '*const [10:0]u8'
// note: cast discards const qualifier

// But cannot change individual bytes
std.mem.copy(u8, id, "THIS_IS_ANOTHER_ID");
//               ^~
// error: expected type '[]u8', found '[]const u8'
// note: cast discards const qualifier
Run Code Online (Sandbox Code Playgroud)

你必须决定什么拥有内存:

  • 它可以是每个单独的变量,也可以是一个字段。
  • 或者一个单独的内存缓冲区,或者一个分配器