1

我只想创建一个带有可变字符串(utf-8 文本)的结构。

const Person = struct {
    name: [_]u8, 

};

可能吗?或者我必须设置字符串的最大长度(例如name: [255]u8;)?当我传递给编译器时,它说:

person.zig:5:12: error: unable to infer array size
    name: [_]u8,

无论如何,我想念原生字符串类型,而不必处理字节。有没有图书馆?

4

1 回答 1

2

您可能正在寻找切片类型:[]u8[]const u8. 切片类型包含一个指针和一个长度,因此该结构实际​​上并不直接保存字符串的内存,而是保存在其他地方。https://ziglang.org/documentation/0.9.1/#Slices

const Person = struct {
    name: []const u8,
};

无论如何,我想念原生字符串类型,而不必处理字节。有没有图书馆?

有一些用于 zig 的字符串库,但这取决于您正在寻找的具体功能。如果您正在寻找字符串连接和格式化,您可能可以使用 zig 的内置 ArrayList

const std = @import("std");

const Person = struct {
    name: std.ArrayList(u8),
};

test "person" {
    const allocator = std.testing.allocator;

    var person: Person = .{
        .name = std.ArrayList(u8).init(allocator),
    };
    defer person.name.deinit();
    try person.name.appendSlice("First ");
    try person.name.appendSlice("Last");
    try person.name.writer().print(". Formatted string: {s}", .{"demo"});

    try std.testing.expectEqualSlices(u8, "First Last. Formatted string: demo", person.name.items);
}

如果您正在寻找字符串规范化等 unicode 函数,您可以使用Ziglyph 之类的库

于 2022-02-28T17:40:53.553 回答